<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Amber: Blog</title>
  <subtitle>I write about code and my experiences in tech.</subtitle>
  <link href="https://amberwilson.co.uk/rss.xml" rel="self"/>
  <link href="https://amberwilson.co.uk/blog/"/>
  <updated>Sun, 15 Mar 2026 24:00:00 GMT</updated>
  <id>https://amberwilson.co.uk/blog/</id>
  <author>
    <name>Amber Wilson</name>
  </author>
  
    
    <entry>
      <title>Conferences and Connections</title>
      <link href="https://amberwilson.co.uk/blog/conferences-and-connections/"/>
      <updated>Sun, 15 Mar 2026 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/conferences-and-connections/</id>
      <content type="html">&lt;p&gt;I was so excited to come to Brighton on March 12th 2026 to attend &lt;a href=&quot;https://webdayout.com/&quot;&gt;Web Day Out&lt;/a&gt;. It&#39;s been a long time since I regularly attended conferences. Since COVID, I&#39;ve attended two, the other being &lt;a href=&quot;https://beyondtellerrand.com/events/berlin-2025&quot;&gt;Beyond Tellerrand&lt;/a&gt;. Both of them run by very good people, both with very good speakers and attendees.&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/conferences-and-connections/img/conferences-and-connections.webp&quot; alt=&quot;Buildings on a street in Brighton lit up by red and blue lights.&quot; /&gt;
    &lt;figcaption&gt;New Road in Brighton, UK&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Before COVID, in the early days of my web career, I was fortunate to take part in a lot of conferences—whether attending, volunteering, speaking or representing &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt;. Being part of the web community in this way was pivotal in my career as a web developer. It&#39;s a special experience—being in a room and in face-to-face discussion with other web nerds.&lt;/p&gt;
&lt;p&gt;Having a chance to swap ideas, discuss web news, meet new people, or simply take in the inspiring atmosphere is just a snippet of what makes a conference (or a meetup) worth your money and/or time. Events like these take you out of your regular flow, usually to a place you don&#39;t normally visit. They provide a chance to discover new places, get a better idea of the web world (whether it&#39;s a new CSS feature or the state of the job market), and to top up your enthusiasm for working as a developer.&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/conferences-and-connections/img/coffee-chat.jpg&quot; alt=&quot;Yellow coffee cups, yellow saucers, orange juice and a silver teaspoon on a wooden table.&quot; /&gt;
    &lt;figcaption&gt;Coffee chats at a Brighton coffee shop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&#39;s talk about connections. I mentioned earlier that attending conferences was pivotal for me in my web developer career. Here are the things that helped me make (and keep) connections and how they helped me find success:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers tend to be incredibly nice people who are more than happy to give advice. As a profession that doesn&#39;t always require a formal degree, developers (particularly self-taught ones) understand that the advice they can give, based on their own experiences, can be extremely helpful to others. I never had to feel nervous or shy about asking other developers questions.&lt;/li&gt;
&lt;li&gt;I have never felt the presence of a &amp;quot;hierarchy&amp;quot; among fellow developers. It&#39;s rare that anyone puts themself onto a pedestal. It feels like developers all understand what it takes to become and remain a developer. There is an inherent aura of respect and support, and a desire to swap stories and advice.&lt;/li&gt;
&lt;li&gt;Experienced developers can help newcomers, that seems obvious. But newcomers also help out those who are more experienced. For evidence of this, look to a meetup like codebar. Experienced developers volunteer to coach more junior developers. Why do these coaches give up their time? Ask them and you might get a lot of different answers. One that I have felt myself is that that coaches give knowledge, but newcomers bring enthusiasm and new ideas that a coach who is more stuck in their ways may not have considered. Win win!&lt;/li&gt;
&lt;li&gt;In my experience, the people I meet in the development and design world are more than happy to remain connected over the years. At conferences, I chat with people that I haven&#39;t seen for years, and it&#39;s always like meeting up with close friends. So many connections became and remain my greatest cheerleaders, and that&#39;s really special.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a nutshell—the kindness and support of the community helps lift me up, boost my confidence, and keep me motivated. Through my connections, I was able to prove my enthusiasm and abilities to members of the community, which resulted in job opportunities that would not have been available to me otherwise.&lt;/p&gt;
&lt;p&gt;The web community lifts you up when you need it, celebrates your wins, and wants you to succeed.&lt;/p&gt;
&lt;p&gt;A speaker at Web Day Out told me that years ago there were a huge number of meetups and conferences. It was easy to find speakers, sponsors, and venues. These days, it&#39;s harder. Therefore, it&#39;s harder to keep community events alive and there are less chances to bring community together. That&#39;s why it&#39;s a great idea to support people running conferences and meetups.&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/conferences-and-connections/img/web-day-out.webp&quot; alt=&quot;A man standing in front of a large projector screen with the text &#39;brought to you by clearleft&#39;&quot; /&gt;
    &lt;figcaption&gt;Jeremy Keith of Clearleft at Web Day Out&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Buy your event tickets early and help organisers spread the word. Keeping the web community alive is something that benefits everyone &lt;span role=&quot;img&quot; aria-label=&quot;Red heart emoji&quot;&gt;♥️ &lt;/span&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Five Things I Like and Dislike #1</title>
      <link href="https://amberwilson.co.uk/blog/five-things-i-like-and-dislike-1/"/>
      <updated>Sun, 11 May 2025 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/five-things-i-like-and-dislike-1/</id>
      <content type="html">&lt;p&gt;Inspired by &lt;a href=&quot;https://pawelgrzybek.com/five-things-i-like-dislike-11&quot;&gt;Paweł Grzybek&lt;/a&gt; who was inspired by &lt;a href=&quot;https://critter.blog/?s=Five+things+I+like+right+now&quot;&gt;Michael Crittenden&lt;/a&gt;.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;like&quot;&gt;Like
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/five-things-i-like-and-dislike-1/#like&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Like&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;That the weather is getting warmer so we can all wear cute summery things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using simple techniques to get better at completing 10-15 minutes of a project per day and seeing good results (book writing, piano, exercise).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Daydreaming about learning languages — Spanish, French, sign language etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reconnecting a bit more with web folks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learning more about finances and experimenting more with saving money.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;dislike&quot;&gt;Dislike
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/five-things-i-like-and-dislike-1/#dislike&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Dislike&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Things I pay for being late — public transport in Berlin, hairdresser, piano teacher (I understand companies and people have their reasons though of course).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My short (1-meter) charging cable. I should have spent €10 extra for the 2-meter one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not having enough time or brain power to read all my books.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FOMO on Bluesky just because it gives me too much of a Twitter vibe and I don&#39;t want to be on it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Being ill a lot because I have a child who goes to daycare.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Writing a Book in Public - Switching to Web Dev</title>
      <link href="https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/"/>
      <updated>Wed, 08 Mar 2023 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/</id>
      <content type="html">&lt;p&gt;I&#39;m writing a book for people who want to &lt;strong&gt;change careers and get into web development!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To get updates and sneak peeks please sign up below &lt;span role=&quot;img&quot; aria-label=&quot;heart emoji&quot;&gt;❤️&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://f.convertkit.com/ckjs/ck.5.js&quot;&gt;&lt;/script&gt;
&lt;form action=&quot;https://app.kit.com/forms/8249481/subscriptions&quot; class=&quot;seva-form formkit-form&quot; method=&quot;post&quot; data-sv-form=&quot;8249481&quot; data-uid=&quot;5691deda41&quot; data-format=&quot;inline&quot; data-version=&quot;5&quot; data-options=&#39;{&quot;settings&quot;:{&quot;after_subscribe&quot;:{&quot;action&quot;:&quot;message&quot;,&quot;success_message&quot;:&quot;Success! Now check your email to confirm your subscription.&quot;,&quot;redirect_url&quot;:&quot;&quot;},&quot;analytics&quot;:{&quot;google&quot;:null,&quot;fathom&quot;:null,&quot;facebook&quot;:null,&quot;segment&quot;:null,&quot;pinterest&quot;:null,&quot;sparkloop&quot;:null,&quot;googletagmanager&quot;:null},&quot;modal&quot;:{&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;powered_by&quot;:{&quot;show&quot;:true,&quot;url&quot;:&quot;https://kit.com/features/forms?utm_campaign=poweredby&amp;amp;utm_content=form&amp;amp;utm_medium=referral&amp;amp;utm_source=dynamic&quot;},&quot;recaptcha&quot;:{&quot;enabled&quot;:false},&quot;return_visitor&quot;:{&quot;action&quot;:&quot;show&quot;,&quot;custom_content&quot;:&quot;&quot;},&quot;slide_in&quot;:{&quot;display_in&quot;:&quot;bottom_right&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;sticky_bar&quot;:{&quot;display_in&quot;:&quot;top&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15}},&quot;version&quot;:&quot;5&quot;}&#39; min-width=&quot;400 500 600 700 800&quot;&gt;&lt;div data-style=&quot;clean&quot;&gt;&lt;ul class=&quot;formkit-alert formkit-alert-error&quot; data-element=&quot;errors&quot; data-group=&quot;alert&quot;&gt;&lt;/ul&gt;&lt;div data-element=&quot;fields&quot; data-stacked=&quot;false&quot; class=&quot;seva-fields formkit-form-wrapper&quot;&gt;&lt;div class=&quot;formkit-input-wrapper&quot;&gt;&lt;label class=&quot;hidden&quot; for=&quot;email&quot;&gt;Email:&lt;/label&gt;&lt;input class=&quot;&quot; id=&quot;email&quot; name=&quot;email_address&quot; style=&quot;color: rgb(0, 0, 0); border-color: rgb(227, 227, 227); border-radius: 4px; font-weight: 400;&quot; aria-label=&quot;Email Address&quot; placeholder=&quot;Email Address&quot; required=&quot;&quot; type=&quot;email&quot; /&gt;&lt;/div&gt;&lt;button data-element=&quot;submit&quot; class=&quot;formkit-submit-button&quot;&gt;&lt;div class=&quot;formkit-spinner&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;&quot;&gt;Subscribe&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;style&gt;.formkit-form[data-uid=&quot;5691deda41&quot;] *{box-sizing:border-box;}.formkit-form[data-uid=&quot;5691deda41&quot;]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.formkit-form[data-uid=&quot;5691deda41&quot;] legend{border:none;font-size:inherit;margin-bottom:10px;padding:0;position:relative;display:table;}.formkit-form[data-uid=&quot;5691deda41&quot;] fieldset{border:0;padding:0.01em 0 0 0;margin:0;min-width:0;}.formkit-form[data-uid=&quot;5691deda41&quot;] body:not(:-moz-handler-blocked) fieldset{display:table-cell;}.formkit-form[data-uid=&quot;5691deda41&quot;] h1,.formkit-form[data-uid=&quot;5691deda41&quot;] h2,.formkit-form[data-uid=&quot;5691deda41&quot;] h3,.formkit-form[data-uid=&quot;5691deda41&quot;] h4,.formkit-form[data-uid=&quot;5691deda41&quot;] h5,.formkit-form[data-uid=&quot;5691deda41&quot;] h6{color:inherit;font-size:inherit;font-weight:inherit;}.formkit-form[data-uid=&quot;5691deda41&quot;] h2{font-size:1.5em;margin:1em 0;}.formkit-form[data-uid=&quot;5691deda41&quot;] h3{font-size:1.17em;margin:1em 0;}.formkit-form[data-uid=&quot;5691deda41&quot;] p{color:inherit;font-size:inherit;font-weight:inherit;}.formkit-form[data-uid=&quot;5691deda41&quot;] ol:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] ul:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] blockquote:not([template-default]){text-align:left;}.formkit-form[data-uid=&quot;5691deda41&quot;] p:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] hr:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] blockquote:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] ol:not([template-default]),.formkit-form[data-uid=&quot;5691deda41&quot;] ul:not([template-default]){color:inherit;font-style:initial;}.formkit-form[data-uid=&quot;5691deda41&quot;] .ordered-list,.formkit-form[data-uid=&quot;5691deda41&quot;] .unordered-list{list-style-position:outside !important;padding-left:1em;}.formkit-form[data-uid=&quot;5691deda41&quot;] .list-item{padding-left:0;}.formkit-form[data-uid=&quot;5691deda41&quot;][data-format=&quot;modal&quot;]{display:none;}.formkit-form[data-uid=&quot;5691deda41&quot;][data-format=&quot;slide in&quot;]{display:none;}.formkit-form[data-uid=&quot;5691deda41&quot;][data-format=&quot;sticky bar&quot;]{display:none;}.formkit-sticky-bar .formkit-form[data-uid=&quot;5691deda41&quot;][data-format=&quot;sticky bar&quot;]{display:block;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-select,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-checkboxes{width:100%;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit{border:0;border-radius:5px;color:#ffffff;cursor:pointer;display:inline-block;text-align:center;font-size:15px;font-weight:500;cursor:pointer;margin-bottom:15px;overflow:hidden;padding:0;position:relative;vertical-align:middle;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button:hover,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit:hover,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button:focus,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit:focus{outline:none;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button:hover &gt; span,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit:hover &gt; span,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button:focus &gt; span,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit:focus &gt; span{background-color:rgba(0,0,0,0.1);}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-button &gt; span,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit &gt; span{display:block;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out;padding:12px 24px;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input{background:#ffffff;font-size:15px;padding:12px;border:1px solid #e3e3e3;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;line-height:1.4;margin:0;-webkit-transition:border-color ease-out 300ms;transition:border-color ease-out 300ms;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input:focus{outline:none;border-color:#1677be;-webkit-transition:border-color ease 300ms;transition:border-color ease 300ms;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input::-webkit-input-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input::-moz-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input:-ms-input-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-input::placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;dropdown&quot;]{position:relative;display:inline-block;width:100%;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;dropdown&quot;]::before{content:&quot;&quot;;top:calc(50% - 2.5px);right:10px;position:absolute;pointer-events:none;border-color:#4f4f4f transparent transparent transparent;border-style:solid;border-width:6px 6px 0 6px;height:0;width:0;z-index:999;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;dropdown&quot;] select{height:auto;width:100%;cursor:pointer;color:#333333;line-height:1.4;margin-bottom:0;padding:0 6px;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:15px;padding:12px;padding-right:25px;border:1px solid #e3e3e3;background:#ffffff;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;dropdown&quot;] select:focus{outline:none;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;]{text-align:left;margin:0;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;]{margin-bottom:10px;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] *{cursor:pointer;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;]:last-of-type{margin-bottom:0;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] input[type=&quot;checkbox&quot;]{display:none;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] input[type=&quot;checkbox&quot;] + label::after{content:none;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] input[type=&quot;checkbox&quot;]:checked + label::after{border-color:#ffffff;content:&quot;&quot;;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] input[type=&quot;checkbox&quot;]:checked + label::before{background:#10bf7a;border-color:#10bf7a;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] label{position:relative;display:inline-block;padding-left:28px;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] label::before,.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] label::after{position:absolute;content:&quot;&quot;;display:inline-block;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] label::before{height:16px;width:16px;border:1px solid #e3e3e3;background:#ffffff;left:0px;top:3px;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-group=&quot;checkboxes&quot;] [data-group=&quot;checkbox&quot;] label::after{height:4px;width:8px;border-left:2px solid #4d4d4d;border-bottom:2px solid #4d4d4d;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:8px;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-alert{background:#f9fafb;border:1px solid #e3e3e3;border-radius:5px;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;list-style:none;margin:25px auto;padding:12px;text-align:center;width:100%;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-alert:empty{display:none;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-alert-success{background:#d3fbeb;border-color:#10bf7a;color:#0c905c;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-alert-error{background:#fde8e2;border-color:#f2643b;color:#ea4110;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-spinner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:0px;width:0px;margin:0 auto;position:absolute;top:0;left:0;right:0;width:0px;overflow:hidden;text-align:center;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-spinner &gt; div{margin:auto;width:12px;height:12px;background-color:#fff;opacity:0.3;border-radius:100%;display:inline-block;-webkit-animation:formkit-bouncedelay-formkit-form-data-uid-5691deda41- 1.4s infinite ease-in-out both;animation:formkit-bouncedelay-formkit-form-data-uid-5691deda41- 1.4s infinite ease-in-out both;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-spinner &gt; div:nth-child(1){-webkit-animation-delay:-0.32s;animation-delay:-0.32s;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-spinner &gt; div:nth-child(2){-webkit-animation-delay:-0.16s;animation-delay:-0.16s;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit[data-active] .formkit-spinner{opacity:1;height:100%;width:50px;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit[data-active] .formkit-spinner ~ span{opacity:0;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by[data-active=&quot;false&quot;]{opacity:0.35;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin:10px 0;position:relative;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit-container[data-active=&quot;false&quot;]{opacity:0.35;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#ffffff;border-radius:9px;color:#3d3d3d;cursor:pointer;display:block;height:36px;margin:0 auto;opacity:0.95;padding:0;-webkit-text-decoration:none;text-decoration:none;text-indent:100%;-webkit-transition:ease-in-out all 200ms;transition:ease-in-out all 200ms;white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:157px;background-repeat:no-repeat;background-position:center;background-image:url(&quot;data:image/svg+xml;charset=utf8,%3Csvg width=&#39;133&#39; height=&#39;36&#39; viewBox=&#39;0 0 133 36&#39; fill=&#39;none&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Cpath d=&#39;M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z&#39; fill=&#39;%231E1E1E&#39;/%3E%3Cpath d=&#39;M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z&#39; fill=&#39;%231E1E1E&#39;/%3E%3C/svg%3E&quot;);}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit:hover,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit:focus{background-color:#ffffff;-webkit-transform:scale(1.025) perspective(1px);-ms-transform:scale(1.025) perspective(1px);transform:scale(1.025) perspective(1px);opacity:1;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit[data-variant=&quot;dark&quot;],.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit[data-variant=&quot;light&quot;]{background-color:transparent;border-color:transparent;width:133px;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit[data-variant=&quot;light&quot;]{color:#ffffff;background-image:url(&quot;data:image/svg+xml;charset=utf8,%3Csvg width=&#39;133&#39; height=&#39;36&#39; viewBox=&#39;0 0 133 36&#39; fill=&#39;none&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Cpath d=&#39;M0.861 25.5C0.735 25.5 0.651 25.416 0.651 25.29V10.548C0.651 10.422 0.735 10.338 0.861 10.338H6.279C9.072 10.338 10.668 11.451 10.668 13.824C10.668 15.819 9.219 16.932 8.001 17.226C7.707 17.268 7.707 17.625 8.022 17.688C9.912 18.108 11.088 19.116 11.088 21.321C11.088 23.715 9.429 25.5 6.426 25.5H0.861ZM5.397 23.085C6.825 23.085 7.518 22.224 7.518 21.006C7.518 19.683 6.825 18.948 5.397 18.948H4.2V23.085H5.397ZM5.313 16.617C6.51 16.617 7.245 15.945 7.245 14.601C7.245 13.383 6.51 12.753 5.25 12.753H4.2V16.617H5.313ZM17.9758 23.883C17.9758 23.568 17.6608 23.505 17.5348 23.799C17.0308 24.954 16.1698 25.731 14.5528 25.731C12.8728 25.731 12.0958 24.471 12.0958 22.707V14.937C12.0958 14.811 12.1798 14.727 12.3058 14.727H15.2248C15.3508 14.727 15.4348 14.811 15.4348 14.937V21.657C15.4348 22.581 15.7708 23.022 16.4638 23.022C17.1778 23.022 17.6188 22.581 17.6188 21.657V14.937C17.6188 14.811 17.7028 14.727 17.8288 14.727H20.7478C20.8738 14.727 20.9578 14.811 20.9578 14.937V25.29C20.9578 25.416 20.8738 25.5 20.7478 25.5H18.1858C18.0598 25.5 17.9758 25.416 17.9758 25.29V23.883ZM25.6141 25.29C25.6141 25.416 25.5301 25.5 25.4041 25.5H22.4851C22.3591 25.5 22.2751 25.416 22.2751 25.29V14.937C22.2751 14.811 22.3591 14.727 22.4851 14.727H25.4041C25.5301 14.727 25.6141 14.811 25.6141 14.937V25.29ZM23.9131 13.74C22.8001 13.74 22.0441 12.942 22.0441 11.934C22.0441 10.926 22.8001 10.107 23.9131 10.107C25.0051 10.107 25.7611 10.926 25.7611 11.934C25.7611 12.942 25.0051 13.74 23.9131 13.74ZM26.7883 10.548C26.7883 10.422 26.8723 10.338 26.9983 10.338H29.9173C30.0433 10.338 30.1273 10.422 30.1273 10.548V22.056C30.1273 22.749 30.2533 23.085 30.8203 23.085C31.0093 23.085 31.1983 23.043 31.3663 23.001C31.5133 22.959 31.6183 22.959 31.6183 23.127V25.059C31.6183 25.164 31.5763 25.269 31.4923 25.311C30.9673 25.521 30.2953 25.71 29.5813 25.71C27.7123 25.71 26.7883 24.639 26.7883 22.476V10.548ZM32.4237 14.727C32.8227 14.727 32.9277 14.538 32.9697 14.055L33.1167 12.039C33.1167 11.913 33.2217 11.829 33.3477 11.829H35.8887C36.0147 11.829 36.0987 11.913 36.0987 12.039V14.517C36.0987 14.643 36.1827 14.727 36.3087 14.727H38.2827C38.4087 14.727 38.4927 14.811 38.4927 14.937V16.659C38.4927 16.785 38.4087 16.869 38.2827 16.869H36.0777V22.056C36.0777 22.875 36.5397 23.085 37.0647 23.085C37.4847 23.085 37.9467 22.938 38.3247 22.707C38.4717 22.623 38.5767 22.665 38.5767 22.833V24.828C38.5767 24.933 38.5347 25.017 38.4507 25.08C37.8417 25.458 36.9807 25.71 36.0357 25.71C34.2927 25.71 32.7387 24.912 32.7387 22.476V16.869H31.8567C31.7307 16.869 31.6467 16.785 31.6467 16.659V14.937C31.6467 14.811 31.7307 14.727 31.8567 14.727H32.4237ZM51.3808 14.727C51.5068 14.727 51.5908 14.79 51.6118 14.916L52.3888 19.851L52.5778 21.174C52.6198 21.468 52.9558 21.468 52.9768 21.174C53.0398 20.712 53.0818 20.271 53.1658 19.83L53.8798 14.916C53.9008 14.79 53.9848 14.727 54.1108 14.727H56.6728C56.8198 14.727 56.8828 14.811 56.8618 14.958L54.6778 25.311C54.6568 25.437 54.5728 25.5 54.4468 25.5H51.3178C51.1918 25.5 51.1078 25.437 51.0868 25.311L50.1208 20.082L49.8898 18.633C49.8688 18.444 49.6588 18.444 49.6378 18.633L49.4068 20.103L48.5458 25.311C48.5248 25.437 48.4408 25.5 48.3148 25.5H45.2068C45.0808 25.5 44.9968 25.437 44.9758 25.311L42.8128 14.958C42.7918 14.811 42.8548 14.727 43.0018 14.727H45.9628C46.0888 14.727 46.1728 14.79 46.1938 14.916L46.9288 19.83C47.0128 20.271 47.0758 20.754 47.1388 21.195C47.2018 21.51 47.4748 21.531 47.5378 21.195L47.7478 19.872L48.6088 14.916C48.6298 14.79 48.7138 14.727 48.8398 14.727H51.3808ZM61.1582 25.29C61.1582 25.416 61.0742 25.5 60.9482 25.5H58.0292C57.9032 25.5 57.8192 25.416 57.8192 25.29V14.937C57.8192 14.811 57.9032 14.727 58.0292 14.727H60.9482C61.0742 14.727 61.1582 14.811 61.1582 14.937V25.29ZM59.4572 13.74C58.3442 13.74 57.5882 12.942 57.5882 11.934C57.5882 10.926 58.3442 10.107 59.4572 10.107C60.5492 10.107 61.3052 10.926 61.3052 11.934C61.3052 12.942 60.5492 13.74 59.4572 13.74ZM62.8154 14.727C63.2144 14.727 63.3194 14.538 63.3614 14.055L63.5084 12.039C63.5084 11.913 63.6134 11.829 63.7394 11.829H66.2804C66.4064 11.829 66.4904 11.913 66.4904 12.039V14.517C66.4904 14.643 66.5744 14.727 66.7004 14.727H68.6744C68.8004 14.727 68.8844 14.811 68.8844 14.937V16.659C68.8844 16.785 68.8004 16.869 68.6744 16.869H66.4694V22.056C66.4694 22.875 66.9314 23.085 67.4564 23.085C67.8764 23.085 68.3384 22.938 68.7164 22.707C68.8634 22.623 68.9684 22.665 68.9684 22.833V24.828C68.9684 24.933 68.9264 25.017 68.8424 25.08C68.2334 25.458 67.3724 25.71 66.4274 25.71C64.6844 25.71 63.1304 24.912 63.1304 22.476V16.869H62.2484C62.1224 16.869 62.0384 16.785 62.0384 16.659V14.937C62.0384 14.811 62.1224 14.727 62.2484 14.727H62.8154ZM73.4298 16.323C73.4298 16.638 73.7868 16.68 73.9128 16.407C74.3748 15.315 75.1308 14.496 76.6008 14.496C78.2178 14.496 78.9528 15.609 78.9528 17.373V25.29C78.9528 25.416 78.8688 25.5 78.7428 25.5H75.8238C75.6978 25.5 75.6138 25.416 75.6138 25.29V18.633C75.6138 17.709 75.2778 17.268 74.5848 17.268C73.8708 17.268 73.4298 17.709 73.4298 18.633V25.29C73.4298 25.416 73.3458 25.5 73.2198 25.5H70.3008C70.1748 25.5 70.0908 25.416 70.0908 25.29V10.548C70.0908 10.422 70.1748 10.338 70.3008 10.338H73.2198C73.3458 10.338 73.4298 10.422 73.4298 10.548V16.323Z&#39; fill=&#39;white&#39;/%3E%3Cpath d=&#39;M100.132 16.3203C105.58 17.3761 107.272 22.4211 107.318 27.4961C107.318 27.6101 107.226 27.7041 107.112 27.7041H100.252C100.138 27.7041 100.046 27.6121 100.046 27.5001C100.026 23.5629 99.3877 20.0896 95.4865 19.9396C95.3705 19.9356 95.2725 20.0276 95.2725 20.1456V27.5001C95.2725 27.6141 95.1806 27.7061 95.0666 27.7061H88.206C88.092 27.7061 88 27.6141 88 27.5001V8.75585C88 8.64187 88.092 8.54989 88.206 8.54989H95.0686C95.1826 8.54989 95.2745 8.64187 95.2745 8.75585V15.7764C95.2745 15.8804 95.3585 15.9644 95.4625 15.9644C95.5445 15.9644 95.6185 15.9104 95.6425 15.8324C97.4081 10.0416 100.709 8.58588 106.07 8.55189C106.184 8.55189 106.276 8.64387 106.276 8.75785V15.7604C106.276 15.8744 106.184 15.9664 106.07 15.9664H100.166C100.066 15.9664 99.9856 16.0464 99.9856 16.1464C99.9856 16.2304 100.048 16.3043 100.132 16.3203ZM118.918 20.7095V16.1704C118.918 16.0564 119.01 15.9644 119.124 15.9644H124.173C124.273 15.9644 124.353 15.8844 124.353 15.7844C124.353 15.6985 124.291 15.6245 124.207 15.6085C120.256 14.8246 118.432 12.5511 118.37 8.75585C118.368 8.64387 118.458 8.54989 118.572 8.54989H125.986C126.1 8.54989 126.192 8.64187 126.192 8.75585V11.9532C126.192 12.0672 126.284 12.1592 126.398 12.1592H130.649C130.763 12.1592 130.855 12.2511 130.855 12.3651V15.7624C130.855 15.8764 130.763 15.9684 130.649 15.9684H126.398C126.284 15.9684 126.192 16.0604 126.192 16.1744V19.8356C126.192 21.1294 126.986 21.5553 128.04 21.5553C129.692 21.5553 131.323 20.8114 131.977 20.4735C132.113 20.4035 132.277 20.5015 132.277 20.6555V26.3543C132.277 26.5063 132.193 26.6463 132.059 26.7183C131.413 27.0582 129.418 28 127.136 28C122.435 27.996 118.918 26.0824 118.918 20.7095ZM109.266 27.4981V16.1704C109.266 16.0564 109.358 15.9644 109.472 15.9644H116.334C116.448 15.9644 116.54 16.0564 116.54 16.1704V27.4981C116.54 27.6121 116.448 27.7041 116.334 27.7041H109.472C109.358 27.7021 109.266 27.6101 109.266 27.4981ZM108.876 11.4913C108.876 13.4189 110.238 14.9826 112.853 14.9826C115.469 14.9826 116.83 13.4189 116.83 11.4913C116.83 9.56369 115.471 8 112.853 8C110.238 8 108.876 9.56369 108.876 11.4913Z&#39; fill=&#39;white&#39;/%3E%3C/svg%3E&quot;);}@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-5691deda41-{0%,80%,100%{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);}40%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}@keyframes formkit-bouncedelay-formkit-form-data-uid-5691deda41-{0%,80%,100%{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);}40%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}.formkit-form[data-uid=&quot;5691deda41&quot;] blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #e1e1e1;}.formkit-form[data-uid=&quot;5691deda41&quot;] .seva-custom-content{padding:15px;font-size:16px;color:#fff;mix-blend-mode:difference;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-modal.guard{max-width:420px;width:100%;} .formkit-form[data-uid=&quot;5691deda41&quot;]{max-width:700px;}.formkit-form[data-uid=&quot;5691deda41&quot;] [data-style=&quot;clean&quot;]{width:100%;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-fields{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 auto;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-field,.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit{margin:0 0 15px 0;-webkit-flex:1 0 100%;-ms-flex:1 0 100%;flex:1 0 100%;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-powered-by-convertkit-container{margin:0;}.formkit-form[data-uid=&quot;5691deda41&quot;] .formkit-submit{position:static;}.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] [data-style=&quot;clean&quot;],.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] [data-style=&quot;clean&quot;].formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] .formkit-fields[data-stacked=&quot;false&quot;],.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] .formkit-fields[data-stacked=&quot;false&quot;]{margin-left:-5px;margin-right:-5px;}.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-field,.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-field,.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-submit,.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-submit{margin:0 5px 15px 5px;}.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-field,.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-field{-webkit-flex:100 1 auto;-ms-flex:100 1 auto;flex:100 1 auto;}.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;700&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-submit,.formkit-form[data-uid=&quot;5691deda41&quot;][min-width~=&quot;800&quot;] .formkit-fields[data-stacked=&quot;false&quot;] .formkit-submit{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;} &lt;/style&gt;&lt;/form&gt;
&lt;p&gt;To sign up as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Beta_reader&quot;&gt;beta reader&lt;/a&gt; please send an email to &lt;a href=&quot;mailto:switchtowebdev@gmail.com?subject=I&#39;d%20like%20to%20help%20make%20Switch%20to%20Web%20Dev%20great!&quot;&gt;switchtowebdev@gmail.com&lt;/a&gt; &lt;span role=&quot;img&quot; aria-label=&quot;heart emoji&quot;&gt;❤️&lt;/span&gt;&lt;/p&gt;
&lt;section&gt;
&lt;h1&gt;Timeline&lt;/h1&gt;&lt;br /&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;october-2020&quot;&gt;October 2020
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#october-2020&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled October 2020&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I opened Google Docs. Inside, I wrote down everything I could think of about switching careers to web development. I added a table of contents.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/img/october-2020.png&quot; alt=&quot;Google Docs snippet showing October 2020&quot; /&gt;&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;april-2022&quot;&gt;April 2022
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#april-2022&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled April 2022&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I bought and read &amp;quot;&lt;a href=&quot;https://www.amazon.co.uk/gp/product/B00AB77M5S/ref=ppx_yo_dt_b_d_asin_title_o06&quot;&gt;How to Write a Nonfiction eBook in 21 Days - That Readers LOVE!&lt;/a&gt;&amp;quot; by Steve Scott. I opened my Google Doc and wrote down some useful pointers from the book.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;may-2022&quot;&gt;May 2022
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#may-2022&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled May 2022&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I thought I better get on with my book, so I opened my Google Doc. I wrote an introduction and something about personal projects.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;june-2022&quot;&gt;June 2022
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#june-2022&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled June 2022&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I used flashcards to organise a table of contents (which later changed almost completely).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/img/book-flashcards.jpg&quot; alt=&quot;Chapters and subheadings organised onto flashcards&quot; /&gt;&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;september-2022&quot;&gt;September 2022
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#september-2022&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled September 2022&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I bought and read &amp;quot;&lt;a href=&quot;https://www.amazon.co.uk/gp/product/B0983HFQX7/ref=ppx_yo_dt_b_d_asin_title_o00&quot;&gt;Write Useful Books: A modern approach to designing and refining recommendable nonfiction&lt;/a&gt;&amp;quot; by Rob Fitzpatrick. I opened my Google Doc and wrote down some useful pointers from the book. The book helped me realise the table of contents I had created needed improvement.&lt;/p&gt;
&lt;p&gt;I bought and read two other career-switch-to-web books. These books helped me figure out what I did and didn&#39;t want in my book: &amp;quot;&lt;a href=&quot;https://www.amazon.co.uk/How-Get-Job-Web-Development-ebook/dp/B07FBQXB5X/ref=sr_1_1&quot;&gt;How to Get a Job in Web Development: The Ultimate Guide&lt;/a&gt;&amp;quot; and &amp;quot;&lt;a href=&quot;https://www.amazon.co.uk/gp/product/B079152S5T/ref=ppx_yo_dt_b_d_asin_title_o05&quot;&gt;How to Become a Web Developer: The Career Changer&#39;s Guide&lt;/a&gt;&amp;quot;.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;march-2023&quot;&gt;March 2023
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#march-2023&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled March 2023&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Now that my child is in daycare, I can dedicate a little more time to writing. I can also keep telling myself that a little bit of writing a day is better than none. Logic over fear, let&#39;s go!&lt;/p&gt;
&lt;p&gt;My writing mantra is to cut the fluff and tell people exactly what they need, in plain language. Currently feeling thankful for the longer, fluffier paragraphs I wrote years ago. I can take those and cut them down!&lt;/p&gt;
&lt;details&gt;
    &lt;summary&gt;&lt;strong&gt;Update email 1 (31.03.23)&lt;/strong&gt;&lt;/summary&gt;
&lt;p&gt;&lt;u&gt;Progress&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;I have begun to include a mix of personal stories and more factual information.&lt;/p&gt;
&lt;p&gt;Even though I know I don&#39;t need to yet, I&#39;m worrying about things like how to fit the personal stories around the facts, among other things like tone of voice.&lt;/p&gt;
&lt;p&gt;I&#39;m spending lots of time moving chunks of text around and deleting stuff.&lt;/p&gt;
&lt;p&gt;I&#39;m finding that I&#39;m not very comfortable writing huge blocks of text without immediately editing them. Going back to the blocks the next day brings me fresh clarity that enables me to edit better!&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Sneak Peek&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;None yet. Maybe next time ;)&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Inspiration&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;I found a good post from &lt;a href=&quot;https://leobabauta.com/&quot;&gt;Leo Babauta&lt;/a&gt;. He says to make writing easier, write for one person only. I&#39;m writing for people who are in the position I was years ago. I&#39;m writing for people who wish for a career change and are interested in becoming a web developer.&lt;/p&gt;
&lt;/details&gt;
&lt;br /&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;april-2023&quot;&gt;April 2023
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#april-2023&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled April 2023&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Chipping away at the book, paragraph by paragraph, night by night. The work feels slow. Like I am adding dominoes, one at a time, very, very gradually to a long and dusty, years-old line of old dominoes that stretches further than the eye can see. But, I feel good about it! I can&#39;t see or even &lt;em&gt;feel&lt;/em&gt; the progress. Not really. But I know it is there. Once I wrote 100 words a day for 100 days and at the end had 10,000 words of material. Those few words I wrote every day felt so easy to write and grew into something huge. This is what&#39;s happening with my book as well.&lt;/p&gt;
&lt;p&gt;I asked a good friend of mine if she&#39;d share her experiences of becoming a developer with me. She said she&#39;d be happy to support me &lt;span role=&quot;img&quot; aria-label=&quot;heart emoji&quot;&gt;❤️&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I asked on Mastodon &lt;a href=&quot;https://indieweb.social/@ambrwlsn/110208988232303128&quot;&gt;whether anyone knows a new web developer who used to do something else&lt;/a&gt;. I am excited to chat with people!&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;august-2024&quot;&gt;August 2024
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#august-2024&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled August 2024&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Hello! I&#39;m back! I&#39;ve been writing. I have a few chapters set up.&lt;/p&gt;
&lt;p&gt;I&#39;m currently grappling with a question.&lt;/p&gt;
&lt;p&gt;If I write this book in public, include real developer stories, and ask for review help from other developers, how do I market the finished book?&lt;/p&gt;
&lt;p&gt;I don&#39;t want to sell the book as if it&#39;s my accomplishment alone. I don&#39;t want to profit off of it alone. That feels greedy.&lt;/p&gt;
&lt;p&gt;My current idea is to put it up as a digital file via an indie seller website for around $5. This feels underpriced but would make it more accessible to more people and hopefully nod to all the people who supported me along the way.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;april-2025&quot;&gt;April 2025
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#april-2025&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled April 2025&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Alright. Nearly 5 years after starting the book, I am serious about finishing it this time. This may be due to my three year old now sleeping at a consistent time every evening.&lt;/p&gt;
&lt;p&gt;I am planning to interview at least two more people for the section on people&#39;s personal experiences switching careers to web dev.&lt;/p&gt;
&lt;p&gt;A pile of good notes exists that will slowly be worked through.&lt;/p&gt;
&lt;p&gt;The task ahead feels daunting. I need some writing inspiration! On that note, a big shout out to my pal Laura for giving me some &lt;a href=&quot;https://mastodon.social/@alicetragedy/114397613412671541&quot;&gt;much-needed motivation&lt;/a&gt;.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;may-2025&quot;&gt;May 2025
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#may-2025&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled May 2025&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;mastodon-embed&quot; data-embed-url=&quot;https://indieweb.social/@ambrwlsn/114479425843980173/embed&quot; style=&quot;background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;&quot;&gt; &lt;a href=&quot;https://indieweb.social/@ambrwlsn/114479425843980173&quot; target=&quot;_blank&quot; style=&quot;align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, &#39;Segoe UI&#39;, Oxygen, Ubuntu, Cantarell, &#39;Fira Sans&#39;, &#39;Droid Sans&#39;, &#39;Helvetica Neue&#39;, Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;&quot;&gt; &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; width=&quot;32&quot; height=&quot;32&quot; viewBox=&quot;0 0 79 75&quot;&gt;&lt;path d=&quot;M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;div style=&quot;color: #787588; margin-top: 16px;&quot;&gt;Post by @ambrwlsn@indieweb.social&lt;/div&gt; &lt;div style=&quot;font-weight: 500;&quot;&gt;View on Mastodon&lt;/div&gt; &lt;/a&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt; &lt;script data-allowed-prefixes=&quot;https://indieweb.social/&quot; async=&quot;&quot; src=&quot;https://indieweb.social/embed.js&quot;&gt;&lt;/script&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;june-2025&quot;&gt;June 2025
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-book-in-public-switching-to-web-dev/#june-2025&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled June 2025&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I signed up with &lt;a href=&quot;https://app.kit.com/&quot;&gt;Kit&lt;/a&gt; and sent my first book update to my 7 subscribers via that platform! Sign up with my shiny new newsletter form at the top of this page (I added my own label to the email input — do better, Kit!).&lt;/p&gt;
&lt;/section&gt;
</content>
    </entry>
    
    <entry>
      <title>Making the Time to Review Pull Requests</title>
      <link href="https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/"/>
      <updated>Tue, 22 Nov 2022 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/</id>
      <content type="html">&lt;p&gt;Code review is super important. At times I have worried that I&#39;ve spent too long reviewing and not enough time working fast and breaking things. Today I was reminded that time spent on code review is worth its weight in gold.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;contents&quot;&gt;Contents
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#contents&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Contents&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#my-code-review-story&quot;&gt;My Code Review Story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#benefits-of-code-review&quot;&gt;Benefits of Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;my-code-review-story&quot;&gt;My Code Review Story
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#my-code-review-story&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled My Code Review Story&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I was invited to a 1 on 1 meeting with a colleague who had offered to review my code in a pull request on GitHub. She wanted to discuss the three questions I&#39;d left on my pull request.&lt;/p&gt;
&lt;p&gt;Her review was so careful and thoughtful! During the call, she whipped open a Notion file that contained answers to the questions in my pull request. She also showed me a sheet she had created that contained various &lt;a href=&quot;https://amberwilson.co.uk/blog/urls&quot;&gt;URLs&lt;/a&gt; for testing, along with information about each link.&lt;/p&gt;
&lt;p&gt;I felt so good that she had put so much time and effort into her review! She had even had a chat with another engineer to find out how to answer my questions better.&lt;/p&gt;
&lt;p&gt;We discussed possible improvements and solutions for about half an hour. After the call, I felt great. I felt more confident that my pull request could be improved and, once merged, really add value to the project I&#39;m working on. Not only that — but the code will now be clearer and more future-proof.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;benefits-of-code-review&quot;&gt;Benefits of Code Review
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#benefits-of-code-review&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Benefits of Code Review&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Here are some benefits that code review offers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adds to shared knowledge and increases the &lt;a href=&quot;https://en.wikipedia.org/wiki/Bus_factor&quot;&gt;bus factor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improves the quality and future-proofness of code&lt;/li&gt;
&lt;li&gt;Decreases the chance of bugs in code by picking up on things others miss&lt;/li&gt;
&lt;li&gt;Improves the end-user experience&lt;/li&gt;
&lt;li&gt;Reviews are a form of documentation&lt;/li&gt;
&lt;li&gt;Lots of emojis are allowed&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;summary&quot;&gt;Summary
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/making-the-time-to-review-pull-requests/#summary&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Summary&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;There are so many reasons to review code. I urge you to set aside abundant time for code review! It isn&#39;t a waste of time. Anyone who thinks so is a bit silly. Good luck :)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>How to Approach a New Codebase</title>
      <link href="https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/"/>
      <updated>Thu, 25 Feb 2021 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/</id>
      <content type="html">&lt;p&gt;What is your approach for understanding a brand new (complex!) codebase, whether &lt;strong&gt;open source&lt;/strong&gt; or &lt;strong&gt;at a new job&lt;/strong&gt;? I posted this question in the form of a tweet earlier this month and got lots of honest and heartfelt answers from developers! In this blog post, I grouped the answers to help you learn &lt;strong&gt;how to approach a new codebase&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;What is your approach for understanding a brand new (complex!) codebase, whether open source or at a new job? ⬇️&lt;/p&gt;&amp;mdash; Amber Wilson (@ambrwlsn90) - Tuesday February 2nd, 2021. &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/1356681219824644098?ref_src=twsrc%5Etfw&quot;&gt;Original Tweet &lt;span class=&quot;read-more-arrow&quot;&gt;&amp;nbsp;&amp;#8594;&lt;/span&gt;&lt;/a&gt;.&lt;/blockquote&gt;
&lt;p&gt;I want to give a huge thanks to everyone who participated in the above Twitter thread. I have not included handles or names, and have edited responses a little to give this post a consistent tone. Please let me know if you replied to the thread and wish to be credited or are unhappy with my edits.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;contents&quot;&gt;Contents
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#contents&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Contents&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;h3&gt;Explore&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#start-from-the-top&quot;&gt;Start from the top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#you-do-not-need-to-understand-the-whole-codebase&quot;&gt;You do not need to understand the whole codebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#use-the-finished-product-yourself&quot;&gt;Use the finished product yourself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#run-the-code-locally&quot;&gt;Run the code locally&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#ask-questions&quot;&gt;Ask questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#pair-program&quot;&gt;Pair program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#read-and-write-documentation&quot;&gt;Read and write documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#take-notes&quot;&gt;Take notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Build&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#fix-bugs-and-debug-code&quot;&gt;Fix bugs and debug code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#tests-tests-tests&quot;&gt;Tests tests tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#watch-logs-and-error-messages&quot;&gt;Watch logs and error messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#build-features&quot;&gt;Build features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step by step advice&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#step-by-step-advice&quot;&gt;Step by step advice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Humour helps&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#funny-stories&quot;&gt;Funny stories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;start-from-the-top&quot;&gt;Start from the top
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#start-from-the-top&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Start from the top&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sketch out the structure of a codebase and look through it with my team or the person I am replacing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I agree that a high-level conceptual overview first is a good idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I start by drilling down to something specific. Not “what does this do”, but “how does this do &#39;X&#39;?”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the highest level of interface, whether user interface (UI) or application programming interface (API), that a customer or end-user would use. View the user interaction as the top level of a feature, and drill down from there, taking it apart piece by piece, right down to the lowest level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get a high level overview of a codebase, and then learn by example. This means solving a specific problem and using this to help understand a codebase. This also works for onboarding, especially for a complex project, where it is usually best to give a high-level introduction and then learn details doing the first story or ticket.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I like to get an overview and then go straight to work on something small. This way, the unfamiliarity fades away. Then I either find I like the code or I don&#39;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maybe &lt;a href=&quot;https://github.com/glato/emerge&quot;&gt;emerge&lt;/a&gt; could help to visualise, inspect and understand structure, dependencies, and some common metrics in your codebase, if the language is supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up meetings with people on the team to understand the architecture and what parts of the software are responsible for it. Then it’s usually best starting with a small task and over time taking bigger tasks. This way I gradually get an understanding of the codebase.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&#39;m a consultant, so I have to do this at least once every 6-12 months. Learn &lt;em&gt;systems&lt;/em&gt;, not codebases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How does the app work from the user&#39;s point of view? Ask this first.&lt;/li&gt;
&lt;li&gt;How is the application glued together? How does data flow in the context of the architecture?&lt;/li&gt;
&lt;li&gt;How does code go from my computer into production? Understanding the details of the code is much easier in context.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;you-do-not-need-to-understand-the-whole-codebase&quot;&gt;You do not need to understand the whole codebase
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#you-do-not-need-to-understand-the-whole-codebase&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled You do not need to understand the whole codebase&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;When I started my 1.5 year tour at Google a long while ago, it was the first place I&#39;d ever worked where knowing the whole codebase was clearly impossible. Accepting that was liberating. Since then I haven&#39;t concerned myself with knowing a whole codebase and I&#39;m better for it.&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;use-the-finished-product-yourself&quot;&gt;Use the finished product yourself
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#use-the-finished-product-yourself&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Use the finished product yourself&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use it. Like a user. Applies to APIs and libraries too. They all have a user interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Browse through the live version to get an idea of what the application does. Sort of see it from the eyes of the users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;run-the-code-locally&quot;&gt;Run the code locally
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#run-the-code-locally&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Run the code locally&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set up the codebase locally and get it to run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I try to make sure my environment, builds, and things like that work. I can&#39;t count the number of hours I wasted trying to do something, before realising I was missing some key part of the process. Simply going from cloning a repository to building and running the latest version locally gives you loads of good information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;ask-questions&quot;&gt;Ask questions
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#ask-questions&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Ask questions&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Do not be afraid to ask questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask people if you can&#39;t find the answer quickly. It&#39;s better to ask than to waste time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I ask someone who is familiar with the codebase to give me a big picture overview.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep asking questions to the person who wrote the code, with increasing urgency as they get closer and closer to leaving.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;pair-program&quot;&gt;Pair program
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#pair-program&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Pair program&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pair programming is great for getting started with a codebase. We use this technique a lot at &lt;a href=&quot;https://twitter.com/qumulo&quot;&gt;@qumulo&lt;/a&gt; and it is a fast way to pick up a lot of details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grab hold of the nearest experienced developer and make them pair program with you until they&#39;re sick of you! Seriously though, pair or mob programming is probably the best way to introduce anyone to a new codebase or team, regardless of skill levels or complexity!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;read-and-write-documentation&quot;&gt;Read and write documentation
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#read-and-write-documentation&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Read and write documentation&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Try to find internal documentation for certain domain knowledge. Unfortunately, good onboarding documentation for new joiners or new contributers to a codebase is often not readily available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read the documentation, perhaps find a textbook explaining how to understand a codebase based on its tech stack, and try searching for answers on Stack Overflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing the often missing documentation is a great way to learn and a good excuse to talk people and ask questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Good documentation and a code editor with the ability to jump to method definitions is essential I think. That&#39;s the number one thing that helps, for me at least.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read the docs if available.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;take-notes&quot;&gt;Take notes
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#take-notes&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Take notes&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Take notes on everything, in whatever form works for you. You WILL forget things. That&#39;s okay and expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask questions and takes notes as much as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;fix-bugs-and-debug-code&quot;&gt;Fix bugs and debug code
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#fix-bugs-and-debug-code&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Fix bugs and debug code&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go &lt;dfn&gt;spelunking&lt;/dfn&gt; (a term used to describe exploring a cave) in order to find bugs. Reading code or documentation in isolation does not help me to &lt;dfn&gt;grok&lt;/dfn&gt; (understand) a codebase, but contributing to the codebase does.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look at a REST endpoint then follow it to the actual data or action. Add breakpoints to debug the code bit by bit. You can add breakpoints to code within your chosen code editor or inside a browser&#39;s developer tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a small cosmetic change somewhere - extra logging, some debug output in the user interface for example. In trying to make those kinds of changes you often learn a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find a simple bug to fix: reproduce it, look in the code to find the call stack that leads to it. Timebox this! Don&#39;t worry if you get lost. If you are lost, ask someone who has knowledge of the codebase.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the debugger with some breakpoints. Observe what&#39;s going on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&#39;ve been fascinated by how people use incidents as pulling back curtains on specific facets of how things are supposed to work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of the tickets for new hires should be bugs. Maybe the occasional copy change – something small like changing the default order of a list to be &#39;creation time&#39; rather than &#39;alphabetical&#39;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;tests-tests-tests&quot;&gt;Tests tests tests
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#tests-tests-tests&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Tests tests tests&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This may sound aspirational, but get the project up and running and run tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I expect there to be well-documented tests and overall workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Focus on parts of the system needed for a certain feature and discover things through tests and static analysis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look at the tests; hopefully they exist.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start with test cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hands down my preferred approach is to start writing tests for a codebase, or if it already has unit tests, find what area is under tested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing user interface tests, for example using Cypress and API mocking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Changing or adding some tests can help you understand how things work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In practice, almost everybody has to work on codebases they don&#39;t fully &lt;dfn&gt;grok&lt;/dfn&gt; (understand). I forget parts I haven&#39;t touched in a while, so that&#39;s why it pays off to invest in practices enabling people to understand a codebase quickly. These practices involve good tests, good continuous integration/delivery, and ultimately good observability in production too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;watch-logs-and-error-messages&quot;&gt;Watch logs and error messages
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#watch-logs-and-error-messages&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Watch logs and error messages&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;If I’m trying to work out what to &lt;a href=&quot;https://en.wikipedia.org/wiki/Grep&quot;&gt;grep&lt;/a&gt; for, looking at logs or error messages is often helpful. For example, passing random input to a service will spit out a stack trace and an error message as it fails to parse whatever you sent, and that can be pretty revealing.&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;build-features&quot;&gt;Build features
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#build-features&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Build features&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dig in to wherever there are actual changes to be made, and give yourself time to learn from there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Splitting up a code base into smaller, self-contained pieces works especially well for Open Source. It makes one-time contributions easier by minimising the required mental overhead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I focus on understanding the bits I need to work on. Whether it is a bug or feature I’ve been assigned to, and I skip the rest. 95% of the time, a good choice of &lt;a href=&quot;https://en.wikipedia.org/wiki/Grep&quot;&gt;grep&lt;/a&gt; will help me find the files I want, and I work things out from there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;step-by-step-advice&quot;&gt;Step by step advice
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#step-by-step-advice&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Step by step advice&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From experience, it takes time to learn the different components of a codebase, especially ones that are large and complex. Learning comes from working on different features or components, reading documentation, and asking lots of questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I recently started a new job at a company with a HUGE and very complicated codebase, for an enterprise software suite. Here&#39;s what has helped me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find a mentor who is familiar with the code, able to explain clearly, and whose communication style matches yours.&lt;/li&gt;
&lt;li&gt;Get a 10,000 foot overview of the codebase from your mentor: what products the projects or solutions correspond to, any external dependencies on 3rd party libs or apps, a high-level dependency tree, what projects are most relevant to you at this time. Your mentor can hopefully point you in the right direction.&lt;/li&gt;
&lt;li&gt;If you don&#39;t know where to start or what you&#39;re going to be working on, ask! When you start a new job or project, this is the time to ask questions. Ask who the best person is to talk to about each framework.&lt;/li&gt;
&lt;li&gt;Ask about the development process for the area, project, or team you&#39;re working on. What&#39;s the workflow for issues? Who will code review your stuff? Who will test it? What things need to be checked off to call the issue done. Does this involve development testing notes, pull requests or merges, documentation, etc?&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As usual, I feel like my answer leaves people pretty unsatisfied.
You won&#39;t get a handle on a codebase quickly. You can start to understand certain parts and let the rest unfold over time.&lt;/p&gt;
&lt;p&gt;Whenever I talk to people about where questions like this come from, it often one of two things. &amp;quot;I feel like I want to learn this skill&amp;quot; and/or &amp;quot;I feel like I need to learn everything quickly in order to be productive&amp;quot;. That second one is the challenge. I don&#39;t think the second one should be as big a concern as people make it out to be.&lt;/p&gt;
&lt;p&gt;You can contribute without learning the whole codebase. And contributing something that actually ships is the best way to learn a codebase over time. For the first couple of months, I just focus on the thing I want to build. I ask people &amp;quot;where should I put this module?&amp;quot;. More importantly, I ask them why they chose that location. Every time I ask, I get another piece of the puzzle on why the codebase is the way it is.&lt;/p&gt;
&lt;p&gt;There are lots of skills and tactics we can and should pick up as developers. For example, you can pick a feature you understand and then trace how it works. Find all the files that enable it and learn why they are in that location. Most importantly, I wish people would feel less pressure to know a whole codebase in-depth.&lt;/p&gt;
&lt;p&gt;I&#39;ve been at my current job for 2 years and I haven&#39;t seen everything. I&#39;ll learn about a new area when I&#39;m doing something that gives me a reason to learn it. And that&#39;s totally okay. To be clear, what I&#39;m saying is that knowing the codebase won&#39;t help you with fixing incidents as much as you think. When something is broken, it&#39;s usually not code. And if it is, roll it back and look closer at it later. There are a lot of assumptions here. Like having easy, push-button rollbacks. If you don&#39;t have that, then start fighting with whoever you need to in order to get it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resource one: &lt;a href=&quot;https://patricia.no/2018/09/19/reading_other_peoples_code.html&quot;&gt;Highly-recommended presentation on how to read other people&#39;s code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resource two: &lt;a href=&quot;https://www.reddit.com/r/learnpython/comments/gjygza/completed_a_full_python_bootcamp_and_yet_unable/fqow93k/&quot;&gt;Reddit comment on how to approach a codebase&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;funny-stories&quot;&gt;Funny stories
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-to-approach-a-new-codebase/#funny-stories&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Funny stories&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Being a developer can be hard work. At least we can laugh about it with our fellow developers though, right? &lt;span aria-hidden=&quot;true&quot;&gt;😁&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Surprised no one has said “Build a feature using it, then have that feature burn to the ground at 2am.” Because as far as I know, that is most people’s approach.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Panic, become convinced that the person who wrote this was a million times smarter than me, question my choice of profession, wonder how long it will take them to fire me if I can figure this out. Find someone to ask a question, lightbulb moment. All is well with the world again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One exercise I like is digging for the longest code block that nobody else has dared refactor, so it has survived for a long time. I start asking people about it because I know it’s going to be a mess compared to the rest of the codebase. Everyone will give different answers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Mini Blogging Masterclass</title>
      <link href="https://amberwilson.co.uk/blog/mini-blogging-masterclass/"/>
      <updated>Thu, 11 Feb 2021 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/mini-blogging-masterclass/</id>
      <content type="html">&lt;p&gt;A very mini list of things that I usually think of while I&#39;m writing about life and tech, that have helped me to blog better!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My number one tip is that a blog post does &lt;strong&gt;not&lt;/strong&gt; have to be polished and perfect (nothing is ever perfect!) before you post it. This blog post is a great example. It had been a draft for a long time, and I was hesitant to publish it. I waited and waited, just in case I could think of a few more tips. I mean, everyone would benefit from 15 tips rather than 10, right? Wrong. If I didn&#39;t publish, then nobody would benefit from even 1 tip. &lt;a href=&quot;https://adactio.com/journal/1709&quot;&gt;A draft post tends to remain a draft&lt;/a&gt;. Get your posts published. I want to hear your ideas!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don&#39;t always have to write about the next big thing, or what everyone is currently talking about. Countless millions of websites use web technologies that are many years old. Write about whatever interests you and you will find an audience, trust me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog about things that scratch your own itch. For example, you may have had trouble setting up a server, or found it hard to understand a JavaScript library. It can be anything. Posts that explain and describe how you solved a problem you experienced are really helpful to other developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are planning a complex or technical blog post and it seems intimidating, try breaking your plan into smaller steps. Limit the time you spend on each step–30 minutes, for example. Completing each step will help give your motivation a boost, and help you stop feeling lost in one huge task. You can use these regular motivational mini-boosts to keep going and help you write your post!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may think of something you would like to write about, but do not know where to start, or have little idea how to structure the information. A good way to overcome this is to create headings, and place information under these headings. This can influence how you write and section your work and can help you get your awesome post out to the world faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As Anne Lamott, who wrote a book on how to write, says—get all your thoughts down in a &amp;quot;shitty first draft&amp;quot;. Don&#39;t focus on editing grammar or spelling right at the beginning. Your draft will most likely change a lot as you are writing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&#39;t use grammar or spellcheckers much myself but there are definitely a number of tools that can help!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&#39;t blog for attention or money! This will most likely make your motivation for blogging hit a roadblock, and fast. Blog for fun, let your creativity flow, and connect with other people. That&#39;s all it should be about. Other rewards are just side effects.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Writing a Winning Web Developer Resume</title>
      <link href="https://amberwilson.co.uk/blog/writing-a-winning-web-developer-resume/"/>
      <updated>Fri, 15 Jan 2021 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/writing-a-winning-web-developer-resume/</id>
      <content type="html">&lt;p&gt;It&#39;s hiring season!&lt;/p&gt;
&lt;p&gt;Do you want a new web developer job? You might call yourself a frontend (front-end/front end) engineer, a UI developer, a full-stack engineer, a software engineer, etc. There are many different and fun combinations of job titles!&lt;/p&gt;
&lt;p&gt;I will assume you develop things for the web, so you are a web developer.&lt;/p&gt;
&lt;p&gt;This post will give you, a web developer, tips on how to make a good impression at companies you&#39;d like to work at.&lt;/p&gt;
&lt;p&gt;Who cares about a good resume? Well, unless you know people at the company you want to work at, it&#39;s likely &lt;strong&gt;the first impression you&#39;ll make is with your resume&lt;/strong&gt;.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;tips-on-writing-your-web-developer-resume&quot;&gt;Tips on writing your web developer resume
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-winning-web-developer-resume/#tips-on-writing-your-web-developer-resume&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Tips on writing your web developer resume&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;There are loads of tips out there on how to write a good resume. Below are some of my favourites that I gathered from both applying for jobs and from reviewing applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write things you &lt;em&gt;achieved&lt;/em&gt;, not only things you &lt;em&gt;did&lt;/em&gt;&lt;/strong&gt;. For example, instead of &amp;quot;added lots of JavaScript features&amp;quot;, try &amp;quot;added JavaScript features that lowered load time by 400ms&amp;quot;. Did you save your company money? Cool! Did you reduce loading times? Awesome! Explain how you did it and how it benefited your company or customers. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Evidence for how you helped your company succeed or improved customer experience allows reviewers to imagine how you could provide value at their own company.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make sure your listed skills are relevant&lt;/strong&gt;. It is not good to list a skill or technology just because you read a blog post about it or because it is popular. Focus on skills and technologies you have used, enjoyed, and want to use in your next job. There&#39;s nothing much worse than listing way too many skills for a job—mostly because it shows you don&#39;t really care about your application. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Adding relevant skills gives a clearer impression of what you actually enjoy and want to do in your job.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separate your skills section into what you use daily, weekly, and monthly&lt;/strong&gt;. If you only used Redux once a few months back, it&#39;s best not to give the impression that you use it all the time. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Being clear about how often you use different skills or technologies helps a reviewer understand your strengths.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep your &amp;quot;education&amp;quot; section simple&lt;/strong&gt;. Reviewers won&#39;t pay too much attention to it, especially since many web developers are entirely or partially self-taught. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Details about your hands-on coding experience are most often more important than details about your studies.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The person reviewing your resume is short on time but has lot of other resumes to look at&lt;/strong&gt;. Keep your resume short and concise. Imagine a reviewer has only thirty seconds to read each application. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;If you can read through your own resume in 30 seconds then it is a good length.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Look at your resume and be honest - would you enjoy reading it?&lt;/strong&gt; If not, then try to add space between content, use whitespace well, choose a pleasant font, make sure spelling and grammar are correct, cut it down to maximum two pages etc. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;A tidy, short, and well-designed resume with no spelling or grammar errors shows you put effort into your application.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add links to your projects and (if you want) social accounts&lt;/strong&gt;. Linking to project work on a personal website or repository is a great way to show off what you can do. But beware, reviewers will look at your source code! Linking to social accounts is good if you are comfortable with that and believe it can give a useful impression of you. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Links to projects can help reviewers learn even more about you than what you can squeeze onto your resume.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Introduce yourself and your hobbies&lt;/strong&gt;. At the start of your resume it can be nice to introduce yourself by summarising your work experience and perhaps mentioning some of your hobbies. A reviewer may be glad to see that you have interests outside of coding. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Summarising your work experience along with your non-work experiences (hobbies) can help a reviewer see that there is more to you than coding.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;bonus-tips-for-cover-letters-and-interviews&quot;&gt;Bonus tips for cover letters and interviews
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/writing-a-winning-web-developer-resume/#bonus-tips-for-cover-letters-and-interviews&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Bonus tips for cover letters and interviews&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Being a web developer isn&#39;t only about writing code&lt;/strong&gt;. Aside from coding achievements, describe proud moments you had while interacting with others at work, or decisions you made on a problem that helped you avoid wasting time and building up technical debt. Describe how well you collaborate with others and show off your &lt;a href=&quot;https://www.aleksandra.codes/jira-to-javascript&quot;&gt;problem solving skills&lt;/a&gt;. &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Awareness of the importance of non-coding skills is crucial to being a good web developer.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Don&#39;t address your cover letter with &amp;quot;Dear sir or madam&amp;quot;&lt;/strong&gt;. It&#39;s a good idea not to assume the gender of whoever is reviewing your application. Find another way to start your letter - for example &amp;quot;Dear {company name}&amp;quot; or &amp;quot;Hello!&amp;quot; &lt;/p&gt;&lt;div class=&quot;card why-card why-card__bullet-list&quot;&gt;&lt;span class=&quot;card-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;Neutral language ensures that everyone is respected—including your reviewer and your customers.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>2020 Year in Review</title>
      <link href="https://amberwilson.co.uk/blog/2020-year-in-review/"/>
      <updated>Thu, 31 Dec 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/2020-year-in-review/</id>
      <content type="html">&lt;p&gt;I got the idea to write a my first ever retrospective for the year from &lt;a href=&quot;https://monicalent.com/&quot;&gt;Monica Lent&lt;/a&gt;. &lt;span role=&quot;img&quot; aria-hidden=&quot;true&quot;&gt;🙏&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What a year it has been. Back in February I had no idea what the rest of the year was going to look like. I even attended a comedy night in Berlin where one of the comedians joked that she had coronavirus, and the audience actually found it genuinely funny!&lt;/p&gt;
&lt;p&gt;I didn&#39;t get to fly and visit any of my family or international friends this year, which has honestly sucked. I also don&#39;t see much of my local friends and family. I really miss everyone and it feels like a piece of me is missing. The pandemic has also delayed several of my important appointments.&lt;/p&gt;
&lt;p&gt;However, despite the pandemic and its effects on me this year, I am under no illusion of my privilege:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I am happy. I am loved. I have a roof over my head. I am fed. I have disposable income. I enjoy my job. I am warm. I am healthy. I am educated. I have prospects. I have time. I can pursue hobbies. I am safe. I feel included.&lt;br /&gt;&lt;br /&gt;Have you checked your privilege today?&lt;/p&gt;&amp;mdash; Amber Wilson (@ambrwlsn90) &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/1326196231371182083?ref_src=twsrc%5Etfw&quot;&gt;November 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Anyway, in this post I want to try and focus on &lt;strong&gt;what I learned and achieved as a web engineer&lt;/strong&gt; this year.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;what-i-set-out-to-do-in-2020&quot;&gt;What I set out to do in 2020
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#what-i-set-out-to-do-in-2020&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled What I set out to do in 2020&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;For 2020, I did not set out with a particular goal in mind. I was happy to go with the flow, work hard at my job, and maybe write a couple of blog posts on the side.&lt;/p&gt;
&lt;p&gt;One reason I may not have set goals for myself this year is because I had been working towards getting promoted to a mid-level web engineer since October 2019. I got promoted in March. I was pleased with this and did not make any more solid professional goals.&lt;/p&gt;
&lt;p&gt;For 2021, this is going to change. I&#39;ve definitely got some &lt;a href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#plans-for-2021&quot;&gt;plans for 2021&lt;/a&gt;. &lt;span role=&quot;img&quot; aria-hidden=&quot;true&quot;&gt;😎&lt;/span&gt;&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;top-5-articles-released-in-2020&quot;&gt;Top 5 Articles Released in 2020
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#top-5-articles-released-in-2020&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Top 5 Articles Released in 2020&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;My posts on accessibilty and owning your own data did well this year!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/&quot;&gt;Are Your Anchor Links Accessible?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/&quot;&gt;From Gatsby to Eleventy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/&quot;&gt;Grow the IndieWeb with Webmentions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://localhost:8080/blog/how-and-when-to-use-react-usecallback/&quot;&gt;How and when to use React useCallback()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/caches-are-for-copies/&quot;&gt;Caches are for Copies&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&#39;ve been using &lt;a href=&quot;https://plausible.io/&quot;&gt;Plausible Analytics&lt;/a&gt; since mid-November and the above list is based on page views from there.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;achievements-in-2020&quot;&gt;Achievements in 2020
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#achievements-in-2020&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Achievements in 2020&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;It felt really good to remember things I achieved this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Got promoted to &lt;strong&gt;mid-level frontend engineer&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrote &lt;strong&gt;16 blog posts&lt;/strong&gt; (averaging 1 post every ~23 days).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read &lt;strong&gt;12 books&lt;/strong&gt; (I wanted to read more than twice this - oops! I&#39;ll do better next year).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spoke on my first &lt;a href=&quot;https://aquestionofcode.com/62-what-is-it-like-to-have-a-mentor-amber-wilson/&quot;&gt;web podcast&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up my own &lt;strong&gt;home office space&lt;/strong&gt; that I&#39;m quite pleased with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coached remotely at &lt;a href=&quot;https://codebar.io/berlin&quot;&gt;codebar Berlin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Re-designed and re-wrote my site with a static site generator called &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, which turned out to be the &lt;strong&gt;most fun I&#39;ve had coding all year&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Began a &lt;a href=&quot;https://cs50.harvard.edu/college/2020/fall/&quot;&gt;CS50 course&lt;/a&gt; with some nice people, so I can dive into some fundamental computer science topics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cooked a lot of new meals and made a recipe book so I can remember them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Got around 40 new plants, &lt;span aria-hidden=&quot;true&quot;&gt;¾&lt;/span&gt;&lt;span class=&quot;hidden&quot;&gt;three quarters&lt;/span&gt; of which I managed to keep alive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;thanks-i-want-to-give&quot;&gt;Thanks I want to give
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#thanks-i-want-to-give&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Thanks I want to give&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I want to thank a few people this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My partner for being amazing as always. You know why you&#39;re awesome!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy Keith&lt;/a&gt; for his support, mentorship, and being my most fave person ever to debate the web with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://kittygiraudel.com/&quot;&gt;Kitty&lt;/a&gt; for their support, mentorship, and enviable ability to make pretty much anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://includejs.dev/&quot;&gt;Eva&lt;/a&gt; for being a bright light in the murkiness of this year, and getting people motivated to socialise and learn together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/khamiltonuk&quot;&gt;Kristian&lt;/a&gt; for keeping codebar Berlin alive and kicking while staying as cool, calm, and collected as ever.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole of the web community this year has, as usual, been my rock. I can always count on my web friends to lift me up, support me, and motivate me to be the best I can be. I&#39;m looking forward to being a part of this amazing community again next year. Huge love to everyone who is a part of it. &lt;span aria-hidden=&quot;true&quot;&gt;♥&lt;/span&gt;&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;plans-for-2021&quot;&gt;Plans for 2021
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/2020-year-in-review/#plans-for-2021&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Plans for 2021&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;a href=&quot;https://alistapart.com/article/the-career-management-document/&quot;&gt;Career Management Document&lt;/a&gt;. In short, this involves writing down personal and professional achievements at least once a week. It helps you remember what you&#39;ve done and learned, and helps you show this off to employers!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write 3 to 4 blog posts a month. By the end of the year, this means I would have written at least 36 blog posts. That&#39;s more than twice the amount I wrote this year! I want to write this many because there is so much I want to learn.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I don&#39;t understand something, research it and write about it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be aware of the &amp;quot;curse of knowledge&amp;quot; and continue to write posts that developers of all levels can follow along with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read 30 books!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do more &lt;a href=&quot;https://www.codewars.com/&quot;&gt;codewars&lt;/a&gt; challenges.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write at least one codewars challenge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coach at least 5 times in a virtual &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; workshop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Record a video post and/or hold a live stream to teach something about web development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make an Eleventy plugin (e.g. for &lt;a href=&quot;https://indieweb.org/Webmention&quot;&gt;Webmentions&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make more cute things, because the web is a place of expression where you can let your creativity roam free. &lt;span aria-hidden=&quot;true&quot;&gt;✨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Happy New Year!&lt;/strong&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>How and when to use React useCallback()</title>
      <link href="https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/"/>
      <updated>Tue, 22 Dec 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/</id>
      <content type="html">&lt;p&gt;In short, React&#39;s useCallback hook is used to wrap functions. It tells React to not re-create a wrapped function when a component re-renders, unless any of the useCallback&#39;s dependencies change. But when is it necessary to use useCallback?&lt;/p&gt;
&lt;p&gt;Most blog posts I have read on useCallback contain example code where a function wrapped in useCallback could just be moved outside of a component function body and into its own scope. Or placed into a useEffect instead. React is a smart library that is optimised to not need a hook like useCallback in most situations.&lt;/p&gt;
&lt;p&gt;The example code in this post aims to be more &amp;quot;real-world&amp;quot;. Because of this, it&#39;s necessarily quite complex. As well as using common React hooks such as useState, useEffect, it also uses a number of JavaScript methods such as the fetch API, promises, filtering, splicing, destructuring, and currying.&lt;/p&gt;
&lt;p&gt;Even if you aren&#39;t an expert in all of the methods used in the example code, I hope you can still learn something!&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;object-references&quot;&gt;Object references
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/#object-references&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Object references&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I want to explain an important fundamental JavaScript concept that will make understanding useCallback easier—object references:&lt;/p&gt;
&lt;p&gt;Functions are objects in JavaScript. Even if two functions are identical, they won&#39;t equal each other:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dog1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;14/10&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// has a unique object reference&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dog2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;14/10&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// has a unique object reference&lt;/span&gt;

dog1 &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; dog2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// false&lt;/span&gt;
dog1 &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; dog2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In comparison, if an object assigned to a variable is directly assigned to another variable, the references will match:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dog1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;14/10&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// has a unique object reference&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dog2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dog1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// assign the unique object reference of dog1 to a variable named dog2&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// dog1 and dog2 point to same object reference&lt;/span&gt;
dog1 &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; dog2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// true&lt;/span&gt;
dog1 &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; dog2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the &lt;a href=&quot;https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/#example-app&quot;&gt;next section&lt;/a&gt;, we&#39;ll see why object references are fundamental to writing and understanding React apps.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;example-app&quot;&gt;Example app
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/#example-app&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Example app&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;This section will go through and explain each step of a &lt;strong&gt;dog park&lt;/strong&gt; example app &lt;span aria-hidden=&quot;true&quot;&gt;🐶&lt;/span&gt;. If you want to take a look at the final code, here is the &lt;a href=&quot;https://github.com/ambrwlsn/dog-park&quot;&gt;Dog Park GitHub repository&lt;/a&gt;. If you want to see a live version of the app, here is the &lt;a href=&quot;https://the-dog-park.netlify.app/&quot;&gt;Dog Park app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The initial features that I built into the dog park app were pretty cool. They let you set a name for your park and choose the number of dogs in it!&lt;/p&gt;
&lt;p&gt;Inside the function body of the DogPark component, there is a function called fetchDog. This function fetches an array of dogs from &lt;a href=&quot;https://documenter.getpostman.com/view/4016432/the-dog-api/RW81vZ4Z#77124c23-dc8b-48f0-9cc2-7e009ecf74fe&quot;&gt;The Dog API by Postman&lt;/a&gt;. DogPark re-renders whenever a user interacts with any of its elements, including its child component, Dogs. &lt;strong&gt;Whenever DogPark re-renders, fetchDog will be re-created and receive a new object reference&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useState&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useCallback &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dogs &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./Dogs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; shuffle &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./shuffle&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;DogPark&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setText&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;handleText&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;setText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Gets a new object reference when it is re-created.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// It is re-created whenever DogPark re-renders.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchDog&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://api.thedogapi.com/v1/breeds/&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;splice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Welcome to &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;The Dog Park&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          Name your dog park:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;handleText&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Add the perfect Dogs to your park! Maximum of 10.&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Dogs&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onFetchDog&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;fetchDog&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; DogPark&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s take a look at the Dogs component:&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useEffect&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useState &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;react&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Dogs&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; onFetchDog &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setNumber&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;dogList&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setDogList&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Runs the &quot;fetchDog&quot; function when either the number&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// variable or the onFetchDog variable changes.&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;number &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; onFetchDog &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;function&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchDog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onFetchDog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;setDogList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;fetchDog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;onFetchDog&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// dependencies of the useEffect&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        Number of dogs:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;10&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setNumber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dogList &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dogList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Dogs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The useEffect in the Dogs component has in its dependency array the fetchDog function (which has been passed down as onFetchDog), and the numbers variable.&lt;/p&gt;
&lt;p&gt;An input with a type of number lives inside the Dogs component. Whenever the number of dogs is changed, Dogs will re-render and fetchDog will be run. This is good! It&#39;s what we want. Note: when state that lives inside a child component changes and the child is re-rendered, this will not trigger a re-render of the parent component.&lt;/p&gt;
&lt;p&gt;If state that lives inside the parent component changes and the parent is re-rendered, the child component will also re-render. In the majority of cases, this is normal, expected behaviour. In the small number of cases this is causing an obvious rendering issue, you can try wrapping the child component in &lt;a href=&quot;https://reactjs.org/docs/react-api.html#reactmemo&quot;&gt;React.memo&lt;/a&gt;. However, if a value in the parent component that the child component depends on gets a new object reference, React.memo won&#39;t work. In our app, Dogs depends on the fetchDog function coming from DogPark.&lt;/p&gt;
&lt;p&gt;Whenever a character is typed into the &amp;quot;Name your dog park&amp;quot; input in DogPark, DogPark will re-render and fetchDog will be re-created and get a new object reference. Dogs will also re-render and because the fetchDog dependency in its useEffect has changed, the useEffect will trigger, and the fetchDog function will run. This means that the list of dogs inside Dogs will refresh every time a single character is typed into the &amp;quot;Name your dog park&amp;quot; input. That is not good! It&#39;s not what we want. But what can we do?&lt;/p&gt;
&lt;p&gt;We &lt;em&gt;could&lt;/em&gt; wrap the fetchDog function inside DogPark into a useCallback to ensure it is not re-created each time DogPark re-renders. However, as the fetchDog function has no dependencies, it can safely be moved out of the function body of DogPark. This is a simpler way to ensure that fetchDog is not re-created every time DogPark re-renders:&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This function now lives outside of the DogPark function&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// body and so is not re-created whenever DogPark re-renders&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchDog&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;DogPark&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// DogPark function body&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, so, useCallback wasn&#39;t needed. But now, a &lt;strong&gt;third feature&lt;/strong&gt; is going to be added to the app that &lt;em&gt;is&lt;/em&gt; going to require useCallback. This feature will be the ability to choose dogs that have names beginning with either A-M or N-Z.&lt;/p&gt;
&lt;p&gt;A new state variable and two radio buttons are added. And the fetch function is moved back into DogPark and altered a little:&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;DogPark&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setText&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;// New state variable&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;charRange&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; setCharRange&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;A-M&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;handleText&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchDog&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://api.thedogapi.com/v1/breeds/&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;// Filters dogs depending on the value of &lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;// the new state variable &quot;charRange&quot;&lt;/span&gt;
                json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
                    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; charRange &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;A-M&#39;&lt;/span&gt;
                    &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;N&#39;&lt;/span&gt;
                    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;M&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;splice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Welcome to &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;The Dog Park&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          Name your dog park:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;handleText&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Add the perfect Dogs to your park! Maximum of 10.&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

       &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/* Two new radio buttons */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt; 
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          A-M
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;radio&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;checked&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;charRange &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;A-M&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setDogHalf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;A-M&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          N-Z
          &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;radio&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;checked&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;charRange &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;N-Z&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setDogHalf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;N-Z&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Dogs&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onFetchDog&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;fetchDog&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The fetchDog function now relies on the charRange state that lives within DogPark. This means fetchDog has to live in the function body of DogPark. I thought I could solve this issue by passing charRange to the fetchDog function that&#39;s passed down to Dogs:&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Here, fetchDog is outside of DogPark and gets the&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// charRange state as a curried value but the returned &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// function is still re-created each time DogPark re-renders&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;fetchDog&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;charRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;DogPark&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Dogs&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onFetchDog&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetchDog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;charRange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Even though I successfully moved fetchDog out of DogPark, fetchDog is still re-created every time DogPark re-renders.&lt;/p&gt;
&lt;p&gt;So, fetchDog needs to stay within DogPark, and useCallback can help to avoid fetchDog being re-created every time DogPark re-renders. This means that when a character is typed into the &amp;quot;Name your dog park&amp;quot; input, even though DogPark re-renders, fetchDog keeps its object reference, and so the useEffect in Dogs is not triggered. And the dog list in Dogs is not needlessly refreshed!&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Now the fetchDog function is wrapped in the &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// useCallback hook, with &quot;charRange&quot; in the hook&#39;s&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// dependency array.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchDog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://api.thedogapi.com/v1/breeds/&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; charRange &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;A-M&#39;&lt;/span&gt;
                &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;N&#39;&lt;/span&gt;
                &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; dog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;M&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;splice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;charRange&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;when-to-actually-use-usecallback&quot;&gt;When to actually use useCallback
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/#when-to-actually-use-usecallback&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled When to actually use useCallback&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;In most use cases, your application won&#39;t be affected if a function is re-created and gets a new object reference upon each render. Even so, it can be tempting to proactively wrap a function in a useCallback to improve app performance. However, this premature optimisation can actually do harm rather than doing good. A blog post by Kent Dodds explains &lt;a href=&quot;https://kentcdodds.com/blog/usememo-and-usecallback&quot;&gt;when and when not to use useCallback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A good way to approach using useCallback is reactively rather than proactively. This means that, depending on your components, use it when you obviously need to, and not as a premature performance optimization. In short, don&#39;t wrap every function living inside a function body in a useCallback.&lt;/p&gt;
&lt;p&gt;It&#39;s highly recommended that you have React linting in your development environment, so that your linter can suggest appropriate times to use useCallback.&lt;/p&gt;
&lt;p&gt;If your linter is not suggesting useCallback, but you see that your UI is re-rendering in unexpected ways (as in the example in this post), or you have an infinite loop, check to see whether useCallback helps.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;resources&quot;&gt;Resources
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/how-and-when-to-use-react-usecallback/#resources&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Resources&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Official React docs for &lt;a href=&quot;https://reactjs.org/docs/hooks-reference.html#useeffect&quot;&gt;useEffect&lt;/a&gt; and &lt;a href=&quot;https://reactjs.org/docs/hooks-reference.html#usecallback&quot;&gt;useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kent Dodd&#39;s post on &lt;a href=&quot;https://kentcdodds.com/blog/usememo-and-usecallback&quot;&gt;when to use (and not use) useCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dan Abramov&#39;s &lt;a href=&quot;https://overreacted.io/a-complete-guide-to-useeffect/&quot;&gt;guide on useEffect()&lt;/a&gt; offering a deep dive into React hooks&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Are your Anchor Links Accessible?</title>
      <link href="https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/"/>
      <updated>Mon, 14 Dec 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/</id>
      <content type="html">&lt;p&gt;One day I decided I wanted to add anchor links to each of the sections in my blog posts. Over the past few months, I&#39;d seen these links on a lot of pages—from official documentation pages to smaller blog posts. I find them really useful for sharing sections of pages with other people!&lt;/p&gt;
&lt;p&gt;To make the different sections of my blog posts shareable, I decided to add an anchor link to all of the section headers (&lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;s) in each of my posts.&lt;/p&gt;
&lt;p&gt;While researching the best way to do this, something I noticed again and again was that other sites had almost always implemented anchor links in an inaccessible way.&lt;/p&gt;
&lt;p&gt;Within a few hours, I had made a plugin to automate the addition of anchor links to my blog post sections, AND I had ensured the links were accessible!&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;contents&quot;&gt;Contents
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#contents&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Contents&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#what-are-anchor-links-exactly%3F&quot;&gt;What are anchor links exactly?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#accessibility-check&quot;&gt;Accessibility check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#a-word-of-caution&quot;&gt;A word of caution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#another-option&quot;&gt;Another option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#automating-accessible-anchor-links&quot;&gt;Automating accessible anchor links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#continued-discussion&quot;&gt;Continued discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;what-are-anchor-links-exactly%3F&quot;&gt;What are anchor links exactly?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#what-are-anchor-links-exactly%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled What are anchor links exactly?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Anchor links provide a way to link to separate sections of a page. On this page, hover over the level two headings on desktop to see the links (the links are always visible on smaller screens).&lt;/p&gt;
&lt;p&gt;In essence, an anchor link is a link containg a URL fragment. This fragment usually appears at the end of a URL. It begins with a hash character (&lt;code&gt;#&lt;/code&gt;), and is followed by a string. This string identifies a section in a web page.&lt;/p&gt;
&lt;p&gt;For example, a page may have a section containing a section header element such as an &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;. This element can be given an &lt;code&gt;id&lt;/code&gt; attribute. An anchor link is created when the value of the &lt;code&gt;id&lt;/code&gt; matches the &lt;code&gt;href&lt;/code&gt; value of an anchor (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;) element on the same page. Consider the following code:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Imagine the web page containing this code had the following URL: &lt;code&gt;https://example.com/blog/nice-post/&lt;/code&gt;. Clicking on the hash character within the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element would do two things; the browser window would scroll to the beginning of the introduction section, and the URL would become &lt;code&gt;https://example.com/blog/nice-post/#introduction&lt;/code&gt;. This URL can be shared and when opened in a browser, the page will automatically scroll to the introduction section.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;accessibility-check&quot;&gt;Accessibility check
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#accessibility-check&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Accessibility check&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Of course, I wanted to make sure the anchor links I had written were accessible. I turned on VoiceOver (a screen reader for MacOS), and using caps lock with arrow keys to interact with the page&#39;s content, I moved to my section heading. I found a few issues. Below is the &lt;strong&gt;first&lt;/strong&gt; version of my anchor link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element is inside the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;, VoiceOver reads out &amp;quot;heading level 2 2 items, visited, link number introduction&amp;quot;. A screen reader user who wanted to skip across multiple headings at once would have a nicer experience if they only heard the actual heading text (i.e. &amp;quot;introduction&amp;quot;).&lt;/p&gt;
&lt;p&gt;I realised the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element should exist as a sibling of the heading element, rather than a child of it. This is so that the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; text content remains clear. Below is the &lt;strong&gt;second&lt;/strong&gt; version of my anchor link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element is outside the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;, VoiceOver reads out &amp;quot;link number&amp;quot; for the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; and &amp;quot;heading level two introduction&amp;quot; for the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;. This is a problem, as the elements are not associated with each other in any way.&lt;/p&gt;
&lt;p&gt;Associating anchor links with what they link to is important. Some anchor links I found on a popular site have SVGs with no labels or titles as content. When there is no information about a link available, the screen reader falls back to the href value (e.g. &lt;code&gt;https://example.com/blog/nice-post/&lt;/code&gt;). This makes the purpose of the link hard to decipher.&lt;/p&gt;
&lt;p&gt;I realised I needed to better associate my section headings with their anchor links. Below is the &lt;strong&gt;third&lt;/strong&gt; version of my anchor link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;link to this heading&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-describedby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The attributes I added are &lt;code&gt;aria-label&lt;/code&gt; and &lt;code&gt;aria-describedby&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;aria label&lt;/code&gt; is read out by a screen reader in place of whatever child the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element has. This is necessary for anchor links, as these links often have a single character as text content. One alternative is to describe the link using text content, but visually hide it (hint: I removed this attribute in a later version of my anchor link - refer to the fifth version).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;aria describedby&lt;/code&gt; matches the &lt;code&gt;id&lt;/code&gt; of the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;. When the link is focused, &amp;quot;link, link to this heading&amp;quot; is read out, followed by &amp;quot;introduction&amp;quot;. This is much better, but there could be one more small improvement—having the heading before the link (hint: I removed this attribute in a later version of my anchor link - refer to the fifth version).&lt;/p&gt;
&lt;p&gt;I realised that my anchor links would make more sense if the heading came before the link. Below is the &lt;strong&gt;fourth&lt;/strong&gt; version of my anchor link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;link to this heading&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-describedby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VoiceOver reads the &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; out as &amp;quot;heading level 2 introduction&amp;quot; and the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; as, &amp;quot;link, link to this heading, introduction&amp;quot;. When the heading is first, screen reader users may be able to associate a section heading more easily with its corresponding anchor link.&lt;/p&gt;
&lt;p&gt;While I made great progress by the fourth version of my anchor link, there are final some outstanding issues that I wanted to address. Thanks to my friend &lt;a href=&quot;https://kittygiraudel.com/&quot;&gt;Kitty&lt;/a&gt; for helping me realise these outstanding issues. Be sure to keep up to date with Kitty&#39;s current &lt;a href=&quot;https://kittygiraudel.com/2020/12/01/a11y-advent-calendar/&quot;&gt;A11y Advent Calendar&lt;/a&gt; and check out their other great posts. &lt;span role=&quot;img&quot; aria-hidden=&quot;true&quot;&gt;🙂&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;First, &lt;code&gt;aria-label&lt;/code&gt; is not actually brilliant for accessibility, as some translation services can have trouble accessing its value. So, it&#39;s best to add text content to the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element, and make sure to visually hide it. This way, screen readers can still access it but it&#39;ll be visually hidden for other users. Second, the &lt;code&gt;#&lt;/code&gt; can be left in and hidden from screen readers using &lt;code&gt;aria-hidden&lt;/code&gt;, while still being visible on the page.&lt;/p&gt;
&lt;p&gt;Lastly, I removed &lt;code&gt;aria-describedby&lt;/code&gt; because the anchor link&#39;s text content now references the section heading.&lt;/p&gt;
&lt;p&gt;Here is the &lt;strong&gt;fifth&lt;/strong&gt; version of my anchor link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;#&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Section titled introduction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This fifth and final version of my anchor link is the one I am using on this page, along with a wrapper &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; for styling purposes. It is much better than the first version! However, if you can think of improvements, please let me know.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;a-word-of-caution&quot;&gt;A word of caution
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#a-word-of-caution&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled A word of caution&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit (17th December):&lt;/strong&gt; Beware, there be dragons! &lt;span aria-hidden=&quot;true&quot;&gt;🐉&lt;/span&gt; I realise that including a link (that has its own text content) as a child of a heading may seem tempting (as it can make styling an anchor link easier). However, it&#39;s worth repeating that this can harm accessibility.&lt;/p&gt;
&lt;p&gt;Version one of my example anchor link (see &lt;a href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#accessibility-check&quot;&gt;accessibility check&lt;/a&gt;) introduces the issues caused by placing a link inside a heading, but I want to provide some more context to why it is not a good idea! I&#39;ll do this by describing a handy feature of VoiceOver.&lt;/p&gt;
&lt;p&gt;VoiceOver (and likely also other screen readers) gives a nice overview of a page&#39;s section headings. This feature, called the web rotor, is accessed by default by pressing &lt;code&gt;caps lock&lt;/code&gt; + &lt;code&gt;u&lt;/code&gt; while VoiceOver is on. Below are two screenshots of the web rotor comparing how headings are formed, depending on whether a link is inside or not:&lt;/p&gt;
&lt;figure&gt;
  &lt;img style=&quot;border: 1px solid #ffffff&quot; src=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/img/headings-with-link.png&quot; alt=&quot;web rotor&quot; /&gt;
  &lt;figcaption&gt;VoiceOver web rotor displaying headings containing links&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img style=&quot;border: 1px solid #ffffff&quot; src=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/img/headings-without-link.png&quot; alt=&quot;web rotor&quot; /&gt;
  &lt;figcaption&gt;VoiceOver web rotor displaying headings without links&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If a link that has its own content is placed within a heading, the computed heading text may be more difficult for a screen reader user to understand. This can affect how clear a page&#39;s structure is.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;another-option&quot;&gt;Another option
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#another-option&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Another option&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Edit (18th December):&lt;/strong&gt; Despite warning against the following option above, I want to write about making a whole heading into an anchor link. Or, more specifically, wrapping the heading text content in a link. Several people across different sites have asked me why I didn&#39;t mention this option before:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Interesting reading but why do you need the # symbol in the HTML at all?&lt;br /&gt;&lt;br /&gt;Why not just make the whole heading the link (easier clicked too!) and use ::before or ::after to put the symbol there through CSS? &lt;a href=&quot;https://t.co/ecaDkZjJH0&quot;&gt;https://t.co/ecaDkZjJH0&lt;/a&gt;&lt;/p&gt;&amp;mdash; Barry Pollard (@tunetheweb) &lt;a href=&quot;https://twitter.com/tunetheweb/status/1338984100133294083?ref_src=twsrc%5Etfw&quot;&gt;December 15, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I think both options—using an icon as a link, and making the header a link (when the content of the link is the heading text)—can be valid. However, I have a few concerns with wrapping a heading&#39;s text content in a link:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can be useful separate the anchor link from the heading so that the link can have its own text content&lt;/li&gt;
&lt;li&gt;It may be harder to select heading text wrapped in a link&lt;/li&gt;
&lt;li&gt;Both screen reader and non-screen reader users may find this option less familiar and not understand its purpose&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are two examples of sites that implement anchor links where a link wraps the text content of a heading: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#Including_a_stylesheet&quot;&gt;MDN Web Docs&lt;/a&gt; and &lt;a href=&quot;https://almanac.httparchive.org/en/2019/accessibility#introduction&quot;&gt;The Web Almanac&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is a code example of an accessible anchor link where a link wraps the text content of a heading:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#introduction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    Introduction
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Would you rather implement anchor links in this way? It is a simpler solution. However, it is also less flexible.&lt;/p&gt;
&lt;p&gt;Of course, the way a feature is implemented depends on your own personal use case. But, no matter which way you implement something, please remember to think of the user experience!&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;automating-accessible-anchor-links&quot;&gt;Automating accessible anchor links
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#automating-accessible-anchor-links&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Automating accessible anchor links&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I use &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; together with &lt;a href=&quot;https://github.com/markdown-it&quot;&gt;markdown-it&lt;/a&gt; to convert my markdown files into HTML files.&lt;/p&gt;
&lt;p&gt;I tried finding a plugin that would help me to automate the addition of anchor links for all my &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; elements. I did find one but soon realised it didn&#39;t make accessible links possible. So, I decided to make my own plugin.&lt;/p&gt;
&lt;p&gt;There is handy &lt;a href=&quot;https://github.com/markdown-it/markdown-it/tree/master/docs&quot;&gt;markdown-it developer documentation&lt;/a&gt; for people wanting to create plugins. Using these docs, a &lt;a href=&quot;https://markdown-it.github.io/&quot;&gt;markdown-it demo page&lt;/a&gt;, and some inspiration from a plugin called &lt;a href=&quot;https://github.com/valeriangalliat/markdown-it-anchor&quot;&gt;markdown-it-anchor&lt;/a&gt;, I wrote a plugin.&lt;/p&gt;
&lt;p&gt;Here is &lt;a href=&quot;https://github.com/ambrwlsn/website/blob/da2056c316fa45fa58b443b07be1ac4c5080912e/helpers/markdown-anchor-wat.js#L1&quot;&gt;a permalink to my plugin file&lt;/a&gt;. It recreates parsing functions for opening and closing &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; elements from the &lt;code&gt;markdown-it&lt;/code&gt; library. In my &lt;code&gt;eleventy.config&lt;/code&gt; file, I &lt;code&gt;use&lt;/code&gt; (connect) the plugin with &lt;code&gt;markdown-it&lt;/code&gt;. This allows me to automatically add custom anchor links for all my level two headings.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;continued-discussion&quot;&gt;Continued discussion
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/#continued-discussion&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Continued discussion&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;A few people have been inspired by this post and one of them is &lt;a href=&quot;https://nicolas-hoizey.com/&quot;&gt;Nicolas Hoizey&lt;/a&gt;. In February 2021, Nicolas created &lt;a href=&quot;https://github.com/valeriangalliat/markdown-it-anchor/issues/82&quot;&gt;an issue in markdown-it-anchor&#39;s GitHub repository&lt;/a&gt;, hoping the maintainers would consider making changes.&lt;/p&gt;
&lt;p&gt;What followed was a really good discussion among several people, kicked off by &lt;a href=&quot;https://www.codejam.info/val.html&quot;&gt;Valérian Galliat&lt;/a&gt;, regarding the solution I decided on in this blog post. I definitely recommend reading through the comments because there are some great nuggets of information about accessibility in there!&lt;/p&gt;
&lt;p&gt;Here are some criticisms of the approach to accessible anchor links that I took in this blog post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The text hidden with CSS creates a large gap between heading and paragraphs in Firefox reader mode. However, this could be seen as a reader mode limitation.&lt;/li&gt;
&lt;li&gt;There is an SEO concern that text usually hidden with CSS shows up in descriptions of posts in Google. However, anchor links will most likely not being reported as illegitimate content.&lt;/li&gt;
&lt;li&gt;Text usually hidden with CSS also shows up in RSS readers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some suggested that &lt;code&gt;aria-label&lt;/code&gt; could be used to offer accessible text without the need for &lt;code&gt;aria-labelledby&lt;/code&gt;.  &lt;a href=&quot;https://kittygiraudel.com/&quot;&gt;Kitty&lt;/a&gt; reminded us that &lt;a href=&quot;https://heydonworks.com/article/aria-label-is-a-xenophobe/&quot;&gt;&lt;code&gt;aria-label&lt;/code&gt; is notoriously bad with content translating services&lt;/a&gt; such as Google Translate.&lt;/p&gt;
&lt;p&gt;I learned a lot from the discussion. I still think there is not really a &lt;strong&gt;silver bullet&lt;/strong&gt; to creating accessible anchor links that would suit everyone. There are quite a few ways to approach it, each with their own advantages and disadvantages, based on things like browser support, screen size, screen readers, and more.&lt;/p&gt;
&lt;p&gt;However, &lt;a href=&quot;https://www.tunetheweb.com/&quot;&gt;Barry Pollard&lt;/a&gt; made a good point. His idea is that there are &lt;a href=&quot;https://github.com/valeriangalliat/markdown-it-anchor/issues/82#issuecomment-788268457&quot;&gt;several advantages to making headings into links themselves&lt;/a&gt;. I would be happy to use this approach on my own site. Try to hover or focus &lt;a href=&quot;https://almanac.httparchive.org/en/2020/accessibility#ease-of-reading&quot;&gt;a heading on a Web Almanac post&lt;/a&gt; to see the approach first hand.&lt;/p&gt;
&lt;p&gt;What do you think? I&#39;d love to know if you have any ideas. If so, please comment on the &lt;a href=&quot;https://github.com/valeriangalliat/markdown-it-anchor/issues/82&quot;&gt;GitHub Issue&lt;/a&gt;!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Grow the IndieWeb with Webmentions</title>
      <link href="https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/"/>
      <updated>Tue, 08 Dec 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/</id>
      <content type="html">&lt;p&gt;When I re-made my site with Eleventy, the pages didn&#39;t change much, but I had loads of fun adding new features. The most fun was &lt;strong&gt;webmentions&lt;/strong&gt; and I&#39;m here to convince you to add them!&lt;/p&gt;
&lt;p&gt;First, let me step back and explain why webmentions exist—the IndieWeb.&lt;/p&gt;
&lt;div class=&quot;heading-wrapper&quot;&gt;
    &lt;h2 id=&quot;indieweb&quot;&gt;
        IndieWeb
    &lt;/h2&gt;
    &lt;a aria-label=&quot;link to this heading&quot; aria-describedby=&quot;indieweb&quot; class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/#indieweb&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Check out this official description of the IndieWeb:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The IndieWeb is a community of individual personal websites, connected by simple standards, based on the principles of owning your domain, using it as your primary identity, to publish on your own site (optionally syndicate elsewhere), and own your data—&lt;strong&gt;indieweb.org&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, a community of personal websites, connected together, used as identities, that makes ownership of data possible. 🦄 🌈 How does this all work?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&#39;s a &lt;a href=&quot;https://indieweb.org/&quot;&gt;great IndieWeb resource&lt;/a&gt;  that will tell you everything you need to know&lt;/li&gt;
&lt;li&gt;But, start here if you want to know &lt;a href=&quot;https://indieweb.org/why&quot;&gt;why the IndieWeb deserves your attention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;When you&#39;re convinced, see this handy page for a &lt;a href=&quot;https://indiewebify.me/&quot;&gt; quick start to becoming a citizen of the IndieWeb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;International IndieWebCamps are here to help—I wrote a &lt;a href=&quot;https://amberwilson.co.uk/blog/indiewebcamp/&quot;&gt;post about my first IndieWebCamp visit&lt;/a&gt;&lt;figure&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/img/indiewebcamp2017.png&quot; alt=&quot;Nuernberg IndieWebCamp 2017&quot; /&gt;&lt;figcaption&gt;Nürnberg IndieWebCamp 2017 (I&#39;m in the bottom right)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;heading-wrapper&quot;&gt;
    &lt;h2 id=&quot;webmentions&quot;&gt;
        Webmentions
    &lt;/h2&gt;
    &lt;a aria-label=&quot;link to this heading&quot; aria-describedby=&quot;webmentions&quot; class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/#webmentions&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Now the juicy stuff!&lt;/p&gt;
&lt;p&gt;I think the coolest thing about the IndieWeb is that it is decentralised. Currently, there is a handful of corporations that own much of our data. With webmentions, each person owns their own data and each person can communicate with others. Webmentions are basically a way to display on your personal site ways that others have interacted with your content.&lt;/p&gt;
&lt;p&gt;On my site I display mentions and bookmarks. It&#39;s possible for someone to link to one of my blog posts within one of their blog posts or bookmarks. If they do this, I won&#39;t know about it unless they let me know about it. &lt;a href=&quot;https://webmention.app/&quot;&gt;Letting others know you&#39;ve mentioned their posts can be done manually or can be automated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also display likes, retweets and replies on blog posts that I have tweeted about. If the URL to my post is in my tweet, I can gather the interactions on that tweet and display them on that post. Although most social media platforms do not support webmentions, it&#39;s possible to gather them by using a great free service called &lt;a href=&quot;https://brid.gy/&quot;&gt;Bridgy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some people have had webmentions on their site for many years, so I am a bit behind. &lt;a href=&quot;https://adactio.com/journal/6495&quot;&gt;Jeremy has had webmentions since 2013&lt;/a&gt;. But, there are more people posting content online than ever before, and personal websites aren&#39;t shown the love they used to get.&lt;/p&gt;
&lt;p&gt;So, there has never been a more pressing need to put content creation platforms (e.g. Medium) and social media platforms (e.g. Twitter) second, and put your very own little corner of the web first 💖&lt;/p&gt;
&lt;p&gt;I used Max Böck&#39;s post on &lt;a href=&quot;https://mxb.dev/blog/using-webmentions-on-static-sites/&quot;&gt;using webmentions in Eleventy&lt;/a&gt; to get started. I was able to get something on the screen quickly with Max&#39;s advice, and then I refined the incoming data a bit. Here is a summary of what I did:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign up via &lt;a href=&quot;https://webmention.io/&quot;&gt;Webmention.io&lt;/a&gt; - if this doesn&#39;t work right away, check out ways to &lt;a href=&quot;https://indielogin.com/setup&quot;&gt;set up your website for indie logins&lt;/a&gt; (I&#39;m able to sign in by linking to my GitHub account on my site&#39;s homepage)&lt;/li&gt;
&lt;li&gt;Add two &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags to your HTML document&#39;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; element: &lt;code&gt;&amp;lt;link rel=&amp;quot;pingback&amp;quot; href=&amp;quot;https://webmention.io/{your-domain-here}/xmlrpc&amp;quot;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;link rel=&amp;quot;webmention&amp;quot; href=&amp;quot;https://webmention.io/{your-domain-here}/webmention&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For social media mentions, sign up to &lt;a href=&quot;https://brid.gy/&quot;&gt;Bridgy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fetch &lt;strong&gt;all&lt;/strong&gt; of your site&#39;s webmention data in JSON format using one of the &lt;a href=&quot;https://github.com/aaronpk/webmention.io#api&quot;&gt;webmention endpoints described by IndieWebCamp co-founder Aaron Parecki&lt;/a&gt; and the API token provided by &lt;a href=&quot;https://webmention.io/&quot;&gt;Webmention.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Shape your webmention data however you like - I filter webmentions into separate re-tweet, reply, like, mention, and bookmark functions using the &lt;code&gt;&#39;wm-property&#39;&lt;/code&gt; (check out the &lt;a href=&quot;https://github.com/ambrwlsn/website/blob/1d713ad9fbce19a9bd8821790fd51c1be62e1f76/src/filters/webmentions-filter.js#L51&quot;&gt;filter functions&lt;/a&gt; and before you say anything, yes I know they could be DRYer)&lt;/li&gt;
&lt;li&gt;Use the data to display webmentions on your blog posts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some of my webmentions (from &lt;a href=&quot;https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/&quot;&gt;my Gatsby to Eleventy post&lt;/a&gt;):&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/grow-the-indieweb-with-webmentions/img/webmentions.png&quot; alt=&quot;Amber&#39;s webmentions on her Gatsby to Eleventy post&quot; /&gt;
&lt;p&gt;If all of this seems too difficult and inaccessible, please don&#39;t give up! I thought getting webmentions on my little static site would be &lt;strong&gt;way too difficult&lt;/strong&gt;. But there are so many wonderful posts about setting up webmentions, and so many great people willing to help. I count myself as one of those people :) If you want to implement webmentions on your site and are stuck on any of the points I listed above, ping me on Twitter and I&#39;ll do my best to help out.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>From Gatsby to Eleventy</title>
      <link href="https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/"/>
      <updated>Fri, 20 Nov 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/</id>
      <content type="html">&lt;p&gt;In this post I&#39;ll compare my experience building my personal blogging site (the one you&#39;re on now) with two static site generators (SSGs) - Gatsby and Eleventy.&lt;/p&gt;
&lt;p&gt;The first version of my site was rolled out with Bootstrap CSS and no framework, the second and third used SCSS and again no framework. The fourth version was built with a popular &lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;static site generator (SSG) called Gatsby&lt;/a&gt;. This SSG uses React and GraphQL. My learning curve from using no framework to using Gatsby was not huge though, as I use React and GraphQL at work.&lt;/p&gt;
&lt;p&gt;The fifth, and at the time of publishing this post, current, version of this site uses a &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;static site generator called Eleventy&lt;/a&gt;. I was a bit daunted about using this SSG, because the tools I was used to working with all day weren&#39;t baked in. This meant no default React, or GraphQL. This SSG would be a new paradigm for me to learn from scratch. I&#39;d have to pick a templating language I had never used before, and learn how Eleventy manages data. Even so, there were a number of reasons I wanted to move from Gatsby to Eleventy.&lt;/p&gt;
&lt;p&gt;Firstly, I&#39;ll summarise the reasons that I decided to use Gatsby in the first place. It lets people write React, takes care of a lot of performance concerns for you, and has a lot of good starter templates. So, it&#39;s excellent for getting started quickly, getting a reasonably good site created, and offers a good developer experience. This was a big pull for me, in addition to all the hype it was creating a few years ago, and the fact I could already use its baked-in tools. Also, the fact I could have my very own, nice and shiny single page app (SPA) was a plus for me, at the time.&lt;/p&gt;
&lt;p&gt;Gatsby sounds really good, so why did I move to Eleventy? This is a question I&#39;ve put a lot of thought in to. First, I want to explain that I didn&#39;t add any new features to the site between the Gatsby and Eleventy versions. The only thing that changed is that now, all the &lt;a href=&quot;https://amberwilson.co.uk/learn&quot;&gt;learn posts&lt;/a&gt; have their own page, instead of existing on one page.&lt;/p&gt;
&lt;div class=&quot;heading-wrapper&quot;&gt;
    &lt;h2 id=&quot;benefits-gained&quot;&gt;
        Benefits Gained
    &lt;/h2&gt;
    &lt;a aria-label=&quot;link to this heading&quot; aria-describedby=&quot;benefits-gained&quot; class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/#benefits-gained&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;As my Eleventy site outputs a non-SPA, I didn&#39;t need to check or ensure that it is server-rendered, is able to be crawled by search engines to allow good search engine optimisation (SEO), or works without JavaScript. Non-SPAs do all of this by default.&lt;/li&gt;
&lt;li&gt;A number of Gatsby plugins stopped some of the functionality on my site working. For example, Gatsby&#39;s progressive web app plugin caused my server-side rendering to stop working.&lt;/li&gt;
&lt;li&gt;My site is a personal blog site that does not have thousands of users or masses of data. So, I don&#39;t need to make sure I&#39;m saving on bandwidth or server resources. If I &lt;strong&gt;did&lt;/strong&gt; need that, I would consider creating a SPA, as they tend to request fewer server resources across page views, compared to non-SPAs.&lt;/li&gt;
&lt;li&gt;I don&#39;t need to force users to download large chunks of React library in their browsers. Gatsby by default forces this, and requires a plugin to ensure that React is only used on the server.&lt;/li&gt;
&lt;li&gt;I didn&#39;t need to bother code-splitting any React components to ensure users aren&#39;t downloading my whole site on initial page load.&lt;/li&gt;
&lt;li&gt;I was able to gain more control over performance optimisations such as image rendering. When I first released my Gatsby site, I used their image plugin but ended up disliking several things about it, such as styling inflexibility, and inability to use the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element.&lt;/li&gt;
&lt;li&gt;I know enough about web development that I can write performant code on my own. Therefore, I can do without plugins that enhance performance, but don&#39;t make it clear how they do so. Also, I prefer using my own skills to create things wherever possible, as it teaches me how things really work.&lt;/li&gt;
&lt;li&gt;I could pick and choose what JavaScript is necessary in the client (browser), thereby limiting the size of the JavaScript a user needs to download. The only JavaScript my site needs on the client-side is for the dark mode toggle, the blog search input, a tiny (and privacy-first) analytics tool, and some linked data (JSON-LD) for SEO.&lt;/li&gt;
&lt;li&gt;By writing lower-level template code (Nunjucks vs JSX), I felt like I had more control over the generated code, which allowed me to output better and more consistent HTML.&lt;/li&gt;
&lt;li&gt;Gatsby has GraphQL baked in. For a lot of use cases, especially a personal blog site, GraphQL is overpowered and can be a large learning curve for some.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;heading-wrapper&quot;&gt;
    &lt;h2 id=&quot;challenges-faced&quot;&gt;
        Challenges Faced
    &lt;/h2&gt;
    &lt;a aria-label=&quot;link to this heading&quot; aria-describedby=&quot;challenges-faced&quot; class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/#challenges-faced&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Eleventy is newer and maintained by less people than Gatsby. Therefore, I felt that Eleventy is a bit less feature-rich and has less documentation. Although honestly, this isn&#39;t a huge deal. Firstly, I found Eleventy simpler to use (less abstract), and found the documentation covers all the most important aspects of the SSG. Secondly, almost any time I needed extra help or information, I found it in the form of excellent blog posts or example repositories created by other web developers.&lt;/li&gt;
&lt;li&gt;One of the very few issues I couldn&#39;t find help with was the sharing of one type of data (blog post excerpts) across my Eleventy-powered site. Gatsby, along with React, makes it easy to see what data is being shared and how. Eleventy has a fantastic data-sharing API (in my case the data sharing was orchestrated between Nunjucks and the Eleventy config file). However, I found it to be quite abstracted and struggled a lot trying to get my blog post excerpt data to be easily shared across pages. In the end, I created a workaround for this, but this workaround is quite hacky. I plan to write about it in a separate post.&lt;/li&gt;
&lt;li&gt;I had to learn how to use the Nunjucks templating language. This is only a small nitpick, as the learning curve was in no way steep.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;heading-wrapper&quot;&gt;
    &lt;h2 id=&quot;concluding-thoughts&quot;&gt;
        Concluding Thoughts
    &lt;/h2&gt;
    &lt;a aria-label=&quot;link to this heading&quot; aria-describedby=&quot;concluding-thoughts&quot; class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-gatsby-to-eleventy/#concluding-thoughts&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Using Gatsby has taught me a lot about single page apps, and that&#39;s important! Sometimes using it was frustrating, and a few things broke without me realising why or even when, but these experiences can be good lessons. Also, I am employed to work on a large SPA, and probably will continue to work on SPAs professionally for years to come, so any experience working with them is good!&lt;/p&gt;
&lt;p&gt;I believe it is a good idea to use the &lt;a href=&quot;https://adactio.com/journal/14327&quot;&gt;least-powerful technology possible for any given task&lt;/a&gt;. Building with Eleventy made this possible for me. I find React and GraphQL nice to use, and I was daunted at the thought of not being able to use JSX. But, using simpler and lower-level tools such as Nunjucks made me feel more confident about my site&#39;s output (robust HTML and the least JavaScript possible), and I enjoyed the experience much more than I thought I would.&lt;/p&gt;
&lt;p&gt;Please don&#39;t take what I&#39;ve written here as a reason not to choose Gatsby over Eleventy. I chose to re-write my site in Eleventy for several reasons. I have the knowledge to build in performance and accessibility myself, I realised I didn&#39;t need an SPA for my use case, and I wanted to use simpler, less powerful developer tools. I think developers should use the tools that suit them best. There is only one thing I want to encourage you to do: no matter what tools you use, please pay attention to your site or app&#39;s final output! It&#39;s never a good idea to make users pay for your technology choices.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Caches are for Copies</title>
      <link href="https://amberwilson.co.uk/blog/caches-are-for-copies/"/>
      <updated>Wed, 11 Nov 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/caches-are-for-copies/</id>
      <content type="html">&lt;p&gt;When someone uses their browser to visit your website, the browser fetches files from your website&#39;s server. One example could be a CSS file. Once the CSS file has been fetched, the browser can cache (store) a copy of it. This means that, as the visitor browses your site, the CSS does not need to be fetched once again from the server.&lt;/p&gt;
&lt;p&gt;The advantages of caching a file are: one less network request per page load, less use of the visitor&#39;s internet data, and faster load times. Additionally, CSS is a blocking resource. This means that while it is being fetched and loaded, other files have to wait to be loaded. So, the quicker CSS can be loaded, the quicker a visitor can enjoy your site.&lt;/p&gt;
&lt;p&gt;It is important to note once again that the &lt;strong&gt;files cached by the browser are copies&lt;/strong&gt;. This means that if a file living on your server is updated, the browser might not know about it. Therefore, a visitor might get the outdated copy of that file, rather than the updated one. The file will still load fast, as it is coming from the browser cache, but it will be outdated.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;how-do-servers-manage-files%3F&quot;&gt;How do servers manage files?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/caches-are-for-copies/#how-do-servers-manage-files%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled How do servers manage files?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;The server you&#39;re using to serve your website determines which of your site&#39;s resources are cached, and how they are cached. There are many different server options available. For the rest of this post, I&#39;ll talk about the one hosting the post you are reading -  Netlify.&lt;/p&gt;
&lt;p&gt;Netlify has default cache settings. This means that with no effort on my part, I can write my website, deploy it, and share it without needing to worry about configuring cache settings. There is a &lt;a href=&quot;https://www.netlify.com/blog/2017/02/23/better-living-through-caching/&quot;&gt;blog post about Netlify&#39;s default cache settings entitled &amp;quot;Better Living Through Caching&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I briefly mentioned earlier the issue of getting an outdated file from the cache. Netlify admit that &amp;quot;cache invalidation is one of the hardest problems in computer science&amp;quot; and that they have found a way around this issue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;strong&gt;“max-age=0, must-revalidate, public”&lt;/strong&gt; = “please cache this content, and then do not trust your cache”. This seems a bit counterintuitive, but there’s a good reason.  This favors you as a content creator — you can change any of your content in an instant.
&lt;/blockquote&gt;
&lt;p&gt;So, no visitors will be served outdated files. However, all files are re-requested on every single page load. This would be no good, except that Netlify uses &amp;quot;e-tags&amp;quot;. These are hash values (long strings of unique characters). The server and browser share the e-tags. If a file changes on the server, for example a CSS file, the e-tag value changes, the browser notices, and the changed file is requested.&lt;/p&gt;
&lt;p&gt;Additionally, Netlify makes the constant checking of files faster using their CDN (content delivery network) and HTTP/2. Please look up these two things, as discussing them is beyond the scope of this post.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;trust%2C-then-verify&quot;&gt;Trust, then verify
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/caches-are-for-copies/#trust%2C-then-verify&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Trust, then verify&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;It is a really nice thing in modern web development to be able to enjoy stuff done for you automatically by your browser and server. This doesn&#39;t mean that you shouldn&#39;t know how it all works, though.&lt;/p&gt;
&lt;p&gt;If a server such as Netlify offers default cache settings, it pays to look up what they are, and how they work. A server&#39;s default cache settings are unlikely to be the best for &lt;strong&gt;every&lt;/strong&gt; website.&lt;/p&gt;
&lt;p&gt;If it is necessary to change cache settings for your website, look up how to manually create your own settings. Here is a &lt;a href=&quot;https://docs.netlify.com/routing/headers/#custom-headers&quot;&gt;post on how Netlify users can set custom cache headers&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Accessible Link Text</title>
      <link href="https://amberwilson.co.uk/blog/accessible-link-text/"/>
      <updated>Thu, 05 Nov 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/accessible-link-text/</id>
      <content type="html">&lt;p&gt;I use a bookmarklet tool called &lt;a href=&quot;https://khan.github.io/tota11y/&quot;&gt;Tota11y&lt;/a&gt;, which gives me a quick overview of my site&#39;s accessibility. I opened it on my site&#39;s homepage and clicked &amp;quot;link text&amp;quot;. The tool flagged not one, but SIX inaccessible links. Woops!&lt;/p&gt;
&lt;p&gt;The homepage, GitHub, Twitter, and LinkedIn links were all flagged for the same reason. There was no text between their opening and closing &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags, only an SVG. Even though the tool flagged these links, I didn&#39;t have to change anything. This is because each SVG already had a &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element, paired with a &lt;code&gt;&amp;lt;description&amp;gt;&lt;/code&gt; element to aid accessibility. A screen reader will read out the values of the title and description elements.&lt;/p&gt;
&lt;p&gt;I was a bit confused why the &#39;learn&#39; and &#39;about&#39; navigation links were flagged, so I checked Tota11y&#39;s source code. &lt;a href=&quot;https://github.com/Khan/tota11y/blob/master/plugins/link-text/index.js#L34-L37&quot;&gt;The words &#39;learn&#39; and &#39;about&#39; are listed as stop words&lt;/a&gt;. I believe these words are singled out because they can be used alone or out of context. However, I think that both words make sense in my navigation bar. So, I ignored the warning.&lt;/p&gt;
&lt;p&gt;I was happy that I didn&#39;t have to add any new code in order to make the six flagged links accessible! If an accessibility audit flags any links on your site, and you determine that they are in fact inaccessible, there are a few things you can do.&lt;/p&gt;
&lt;p&gt;One method is to add a &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; next to the existing text that is hidden (&lt;a href=&quot;https://kittygiraudel.com/2016/10/13/css-hide-and-seek/&quot;&gt;this post describes a method for visually hiding text  using CSS&lt;/a&gt;). This would make the text invisible in the UI, but a screen reader would still read it out.&lt;/p&gt;
&lt;p&gt;Another similar method is to add more descriptive (non-hidden) text to links, just as I have done for the link in the previous paragraph.&lt;/p&gt;
&lt;p&gt;The most common method is probably the &lt;code&gt;aria-label&lt;/code&gt; attribute. This is popular because the value of this attribute is read out by a screen reader even if the link already has text. For example, for my &#39;project&#39; link, I could have added &lt;code&gt;aria-label=&amp;quot;a selection of my projects&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://amberwilson.co.uk/blog/accessible-link-text/img/accessible-link-text.png&quot; alt=&quot;A screenshot of the VoiceOver for Chrome screen reader announcing the aria-label of the &#39;projects&#39; link&quot; /&gt;
  &lt;figcaption&gt;
    A screenshot of the VoiceOver for Chrome screen reader announcing the aria-label of the &#39;projects&#39; link
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Note 1 of 2:&lt;/strong&gt; please &lt;a href=&quot;https://amberwilson.co.uk/blog/aria-labels/&quot;&gt;see this post on aria labels&lt;/a&gt; for the important difference between &lt;code&gt;aria-label&lt;/code&gt; and &lt;code&gt;aria-labelledby&lt;/code&gt; (hint: &lt;code&gt;aria-label&lt;/code&gt; values are not always easy for translation systems to access).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note 2 of 2:&lt;/strong&gt; try to use a variety of accessibility tools to audit your web pages. It isn&#39;t possible to catch all accessibility issues with one tool. It&#39;s also probably not possible to catch all issues with ten of them. Manual testing is highly recommended! By that I mean using a screen reader and keyboard to tab around your web pages.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;more-resources&quot;&gt;More resources
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-link-text/#more-resources&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled More resources&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/techniques/hypertext/&quot;&gt;https://webaim.org/techniques/hypertext/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA8&quot;&gt;https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.washington.edu/accessibility/links/&quot;&gt;https://www.washington.edu/accessibility/links/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>From Office to Remote (During a Pandemic)</title>
      <link href="https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/"/>
      <updated>Thu, 10 Sep 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/</id>
      <content type="html">
      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;background&quot;&gt;Background
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/#background&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Background&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I wanted to write my thoughts on remote working as I enter my sixth consecutive month of it. This remote working situation I am in is special because it was not a personal choice, nor would it have been allowed by my company under normal circumstances. As you may have guessed, I am working remotely due to the global corona virus pandemic. Before mid-March of the year 2020, for 5 days each week I travelled to the office, worked there for eight hours, then travelled home.&lt;/p&gt;
&lt;p&gt;In the ~12 years since my first ever job, I&#39;ve never worked remotely 100% of the time. Until two years ago, I&#39;d never worked a single day remotely (I became a web engineer around three years ago).&lt;/p&gt;
&lt;p&gt;I want this post to compare my experience working as a web engineer in an office versus working as a web engineer remotely. I want to note that while I was still working in the office, I had the occasional (once every one or two weeks) work-from-home day. However, I have found that this is not comparable to working from home 100% of the time.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;comparisons&quot;&gt;Comparisons
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/#comparisons&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Comparisons&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I hear a lot about companies that have always been remote, or have been for a long time. Most of these companies seem really happy, and say great things about working remotely! I can&#39;t tell whether the experience of working in a team that has always been remote versus working in a team that pivoted incredibly fast to working remotely during an emotionally-straining global pandemic is similar. I have a feeling it is not, but I can only guess at that.&lt;/p&gt;
&lt;p&gt;For me, the there are some quite strong comparisons between my experience of working in an office, versus half a year of remote working. Some of these lean towards being negative. I&#39;ll mention these first so that I can talk about the happier, more positive things I have gained from the experience, and what I would like to see in the future.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;minus-points&quot;&gt;Minus points
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/#minus-points&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Minus points&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;The first couple of months into remote work, my new working situation was still a novelty and I didn&#39;t have many things to say against it. Half a year in, I am finding that the biggest challenge is the lack of socialising with my colleagues. I can be quite introverted and can get exhausted when lots of people are around me for an extended time. However, I do thrive on meaningful social interactions. Things that I am personally really missing include lack of day-to-day interactions, physical meetings (versus switched-off cameras/staring at screens), and team activities.&lt;/p&gt;
&lt;p&gt;Due to all of this, the way my team works feels more &amp;quot;fragmented&amp;quot; to me, although it&#39;s hard to explain exactly what I mean by this. I feel like it&#39;s a shame that we can&#39;t really share small coding victories, or voice sponteneous ideas to each other. I worry that my team members and I are less able to improve on our professional development, whether from lacking opportunities for informal feedback or being less able to share our needs/wants with each other and get advice.&lt;/p&gt;
&lt;p&gt;To be clear though, I still think my team works really well together and we are still getting features out, making fixes, and moving along with projects at a similar speed to before. I also personally feel like I am still learning a lot, particularly because without a neighbour to ask, I have been solving more problems by myself.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;plus-points&quot;&gt;Plus points
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/#plus-points&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Plus points&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;As mentioned in the previous paragraph, I am learning more, becoming a more independent web engineer, and am still able to work as fast (sometimes faster!) than before. Not having to commute any more (which took away 1,5 - 2 hours of my day) is one thing that helps me finish work faster and remain a lot more focused. Also, I can start work earlier if I feel like it, which also means I can finish earlier if I need to.&lt;/p&gt;
&lt;p&gt;If I am struggling with a code issue, or I am stressed, or I really need a break, I can go and take one. And the break can be in any form I want. I can either take a nap, look at my phone, have a snack, go for a walk, chat with someone outside of work, etc. Ok, so I can do all but one of those things (napping) in an office, but I can do them at my own pace and without being disturbed or feeling pressured to go back to work within a certain time frame. Taking these breaks has helped me solve coding problems and made me much less stressed in my general life.&lt;/p&gt;
&lt;p&gt;My work-life balance has improved a lot due to the removal of a long and often stressful commute, and being trusted to work and get features completed without feeling pressured to appear like I am working. I feel more like I can conduct both my work and life on my own terms. In the last six months as a web engineer, compared to the last three or so years, I am generally calmer, more focused, and less anxious during working hours and non-working hours, thanks to working remotely.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;the-future&quot;&gt;The future
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/from-office-to-remote-during-a-pandemic/#the-future&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled The future&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I can&#39;t tell how working remotely during a pandemic is going to feel after another six months. I haven&#39;t read anyone else&#39;s take on this subject, so I am writing blind here. So then, if asked the question whether I would want to continue working remotely in the future, or join a fully-remote company in the future, what would I say? I think I&#39;d say... &amp;quot;Yes&amp;quot;! But, to continue working remotely I&#39;d want some conditions to be in place. Most importantly for me, I would want a strong team event calendar to be in place. Or some way for the team to bond.&lt;/p&gt;
&lt;p&gt;Team bonding is definitely harder during a pandemic but not impossible. For example, in the past six months that I have been working from home, I&#39;ve attended three remote team event evenings (where we played online games or simply chatted), an in-person meetup with my immediate team, and will soon meet up outside with a few team members to go on a socially-distanced guided tour of Berlin.&lt;/p&gt;
&lt;p&gt;I&#39;ve looked forward hugely to each of the few team events I&#39;ve been a part of since working remotely, although they have all necessarily been quite short, or remote. I look forward to a time when me and my team members can meet for longer periods of time again, like going on a whole-day offsite with the web team. Anything to help my team and I feel more connected!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Make Your Own Dev Tool</title>
      <link href="https://amberwilson.co.uk/blog/make-your-own-dev-tool/"/>
      <updated>Wed, 19 Aug 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/make-your-own-dev-tool/</id>
      <content type="html">&lt;img class=&quot;blog-image&quot; src=&quot;https://amberwilson.co.uk/blog/make-your-own-dev-tool/img/lego-press.jpg&quot; alt=&quot;a child playing with lego&quot; /&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;bookmarklets---a-cool-personal-dev-tool&quot;&gt;Bookmarklets - a cool personal dev tool
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/make-your-own-dev-tool/#bookmarklets---a-cool-personal-dev-tool&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Bookmarklets - a cool personal dev tool&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I have just found out what &lt;strong&gt;bookmarklets&lt;/strong&gt; (aka &lt;strong&gt;favelets&lt;/strong&gt; - a term coined by my friend &lt;a href=&quot;http://tantek.com/&quot;&gt;Tantek&lt;/a&gt; back in the early 2000s) are and I like &#39;em! So what are they?&lt;/p&gt;
&lt;p&gt;Bookmarklets run a JavaScript (JS) script against the DOM of the current document loaded in the browser. They allow a way to alter the DOM at the press of a button. They may not offer all that a browser extension or add-on can, but they can still be super handy, and also do not require downloading or installation of software.&lt;/p&gt;
&lt;p&gt;What&#39;s a nice example of a bookmarklet? Here is a &lt;a href=&quot;https://khan.github.io/tota11y/&quot;&gt;nice accessibility bookmarklet called Tota11y&lt;/a&gt; to try out! Thanks to &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; for showing me this one &lt;span role=&quot;img&quot; aria-label=&quot;thumbs up&quot;&gt;👍&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;How can a bookmarklet like Tota11y be used? First, the bookmarklet&#39;s link needs to either be saved as a bookmark, dragged into the browser&#39;s bookmark toolbar, or be available to be clicked on a web page (used as a normal link within an &lt;code&gt;href&lt;/code&gt; attribute in an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element). Second, while on a valid website, the bookmark containing the bookmarklet link should be clicked to run the bookmarklet&#39;s code.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;how-bookmarklets-work&quot;&gt;How bookmarklets work
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/make-your-own-dev-tool/#how-bookmarklets-work&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled How bookmarklets work&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;First you should know (or be reminded) that in a browser, bookmarks are made up of URIs (uniform resource identifiers). Each URI consists of a protocol such as &lt;code&gt;http:&lt;/code&gt;, &lt;code&gt;https:&lt;/code&gt;, &lt;code&gt;file:&lt;/code&gt;, etc., which is followed by a string. An example is &lt;code&gt;https://cat-bounce.com/&lt;/code&gt;. The &lt;code&gt;https:&lt;/code&gt; is the protocol, and the string is the domain.&lt;/p&gt;
&lt;p&gt;There is also a &lt;code&gt;javascript:&lt;/code&gt; protocol. The browser treats this protocol and its following string just like a JS  application. When visiting a link that is using this JS protocol, the JS code it contains is executed. If such a link is bookmarked, it is called a bookmarklet!&lt;/p&gt;
&lt;p&gt;Something to note is that a link usually works by sending the user to a new page. To prevent a bookmarklet from triggering a page reload, the JS code that makes up the bookmarklet should return an undefined type. To do this, an anonymous, self-executing function can be used (i.e. one that does not return a value, doesn&#39;t have a name, and executes immediately).&lt;/p&gt;
&lt;p&gt;The Tota11y bookmarklet example has a link that points to a hosted JS file. This is because the link would be pretty messy if all the JS code was included as a single string within it. Below is what the Tota11y bookmarklet&#39;s link (in a beautifed format for readability) looks like:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tota11y&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;SCRIPT&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      tota11y&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;text/javascript&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      tota11y&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;https://khan.github.io/tota11y/dist/tota11y.min.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;head&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tota11y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In order for a bookmarklet to point to a hosted JS file, its URI needs to contain a few things. At the very least,it should create a new script element, make this element&#39;s source (src) the hosted JS file, and then append this script to the head of the document.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;making-your-own-bookmarklet&quot;&gt;Making your own bookmarklet
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/make-your-own-dev-tool/#making-your-own-bookmarklet&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Making your own bookmarklet&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;I tried making a bookmarklet and found it was really easy to get started.&lt;/p&gt;
&lt;p&gt;I decided that I&#39;d try something really simple that does not use a hosted JS file, but contains all the JS code in one line. So I made a bookmarklet to put a red border around each paragraph on a page. Here&#39;s what it looks like:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; paragraphs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;p&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; paragraphs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      paragraphs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;border &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;3px solid red&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As mentioned in the previous section, &amp;quot;How bookmarklets work&amp;quot;, a bookmarklet can be made available to use as a link. To do this, the bookmarket&#39;s URI is placed inside the &lt;code&gt;href&lt;/code&gt; attribute of an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element, that can then be dragged into bookmarks or the bookmark toolbar.&lt;/p&gt;
&lt;p&gt;If you like, try either clicking the following link, or drag it into your bookmarks and click on the resulting bookmarklet (refresh the page to remove the effects)!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;javascript:(function(){let paragraphs=document.getElementsByTagName(&#39;p&#39;);for(let i=0;i &lt; paragraphs.length;i++){paragraphs[i].style.border=&#39;3px solid red&#39;;}})();&quot;&gt;Paragraph border maker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is the code that makes up the above link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;javascript:(function(){let paragraphs=document.getElementsByTagName(&#39;p&#39;);for(let i=0;i &amp;lt; paragraphs.length;i++){paragraphs[i].style.border=&#39;3px solid red&#39;;}})();&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  Paragraph border maker
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;some-things-to-note&quot;&gt;Some things to note
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/make-your-own-dev-tool/#some-things-to-note&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Some things to note&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;A browser will automatically encode any characters within a URI that it does not understand (such as quotation marks, spaces etc.) so that a bookmarklet can run smoothly.&lt;/p&gt;
&lt;p&gt;As bookmarklets contain JS, there are security concerns to be aware of when using bookmarklets created by others. However, making a few of your own bookmarklets for personal use, or using ones that have been shown to be trustworthy, is fine. More than fine - it&#39;s great!&lt;/p&gt;
&lt;p&gt;Why are bookmarklets so great? You can make a separate folder for your bookmarklets within your bookmarks folder. Then you can place this bookmarklets folder in your bookmark toolbar for your own list of easy-access, personal dev tools.&lt;/p&gt;
&lt;p&gt;Sometimes browsers may cache bookmarklet code, so changes made after it is added won&#39;t show up.&lt;/p&gt;
&lt;p&gt;Check out this &lt;a href=&quot;https://www.youtube.com/watch?v=DloHqUfPbJc&quot;&gt;nice video on bookmarklets (Chrome-focused)&lt;/a&gt; that covers what I have written about in the &amp;quot;Making your own bookmarklet&amp;quot; section.&lt;/p&gt;
&lt;p&gt;I am completely new to bookmarklets so I may not have covered every essential thing regarding them. I really found them super easy and nice to get started on though. As usual I learn more about them as I keep trying them out!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>In a Land Before Dev Tools</title>
      <link href="https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/"/>
      <updated>Wed, 05 Aug 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/</id>
      <content type="html">&lt;img class=&quot;blog-image&quot; src=&quot;https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/img/dinosaur.jpg&quot; alt=&quot;a toy dinosaur&quot; /&gt;
&lt;p&gt;A long, long time ago in a land before dev tools, there lived all of its predecessors. These ancestors were more basic and didn&#39;t offer the wealth of tools we enjoy today. But, they certainly paved the way!&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;the-beginning&quot;&gt;The beginning
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/#the-beginning&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled The beginning&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;How could developers view code in their browsers in the early nineties?&lt;/p&gt;
&lt;p&gt;They could check out &lt;strong&gt;view source&lt;/strong&gt; (&lt;a href=&quot;https://www.computerhope.com/issues/ch000746.htm&quot;&gt;see how to open view source here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;They could place &lt;code&gt;alert()&lt;/code&gt; boxes throughout their code to test JavaScript. This wasn&#39;t great though, because alerts cannot display complex objects like functions. Also until the alert box(es) are gone, no other tabs or windows can be used.&lt;/p&gt;
&lt;p&gt;Some got into the habit of commenting out code and then uncommenting it, to see if there was any difference in outcome.&lt;/p&gt;
&lt;p&gt;It seemed like there was work to do...&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;the-middle&quot;&gt;The middle
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/#the-middle&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled The middle&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Later in the nineties, a better way to debug HTML came along in the form of this &lt;a href=&quot;https://software.hixie.ch/utilities/js/live-dom-viewer.xml/&quot;&gt;live DOM (document object model) viewer page by Hixie&lt;/a&gt;. The page doesn&#39;t seem to working currently. When working, any HTML entered into the first text area is parsed and appears in a visual DOM tree right underneath. Slightly further down it shows the rendered view.&lt;/p&gt;
&lt;p&gt;Being able to see the DOM was a really important step to understanding how browsers interpret HTML. In the early 2000s, there were a number of people working on tools to improve the useful ability to visualise the DOM, in addition to CSS and JavaScript.&lt;/p&gt;
&lt;p&gt;One of these tools, named Firebug, gained quite a bit of ground. First released in 2006, it existed as an addon (plugin) offered within the Firefox browser itself. The addon served as an extension to its browser software (first released in 2002). To learn more, see this &lt;a href=&quot;https://hacks.mozilla.org/2017/10/saying-goodbye-to-firebug/&quot;&gt;blog post on Firebug&lt;/a&gt;. On this page, there are links to videos that offer a peek at what Firebug was like to use.&lt;/p&gt;
&lt;p&gt;Only a few days after Firebug&#39;s release came Web Inspector. This was bundled directly into the Safari browser. &lt;a href=&quot;https://webkit.org/blog-files/inspector-elements-panel.png&quot;&gt;Check out a picture of Web Inspector here&lt;/a&gt;. This tool also offered the ability to debug HTML, CSS, and JavaScript!&lt;/p&gt;
&lt;p&gt;By 2010, the Chrome browser (released in 2008) had added the ability to right click a page, choose &amp;quot;Inspect element&amp;quot;, and open dev tools.&lt;/p&gt;
&lt;p&gt;From the early 2010s onwards, browser dev tools went from strength to strength. Things like remote debugging of mobile devices, performance panels, and audit panels (plus a lot more) were added. Nowadays, even Node.js can be debugged in dev tools.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;the-end&quot;&gt;The end
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/in-a-land-before-dev-tools/#the-end&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled The end&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Ok so don&#39;t worry, there is no end in sight to the dev tools story!&lt;/p&gt;
&lt;p&gt;Who knows what developer tools will look like in the future? Almost two decades since these tools first began to appear, major browsers are still actively developing them. And, there is no standards body dictating what the tools should do. This means browser makers are pretty much free to add to their tools whatever they like. When and what is added depends quite strongly on what the browser makers&#39; priorities are.&lt;/p&gt;
&lt;p&gt;Some web users choose a browser based on whether their own values line up with that browser&#39;s priorities. For example, any one browser might lean more towards offering more security to its users, becoming more performant, or more accessible etc. That&#39;s a topic for another blog post though…&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Custom Property Coverup</title>
      <link href="https://amberwilson.co.uk/blog/custom-property-coverup/"/>
      <updated>Wed, 22 Jul 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/custom-property-coverup/</id>
      <content type="html">&lt;p&gt;The other day I was discussing CSS custom properties with &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; when I noticed something. When using custom properties, some (but not all) of the custom property values do not show up in the computed values in Chrome dev tools. Jeremy tried the dev tools in Firefox and found the same thing. However, when the same values declared as custom properties are declared as regular CSS properties, the values show up in the computed values section.&lt;/p&gt;
&lt;p&gt;Neither of us had noticed this behaviour before and we were both a bit baffled. Why would the makers of these dev tools purposefully leave out some of the CSS custom property values from the computed values section while the same values declared without custom properties are shown?&lt;/p&gt;
&lt;p&gt;It should be noted that computed custom properties can be shown in dev tools by toggling on browser styles. However when toggled on in this way, the custom property values are not interactive. And, more importantly, custom property values are not browser styles.&lt;/p&gt;
&lt;p&gt;I made a reduced test case in Codepen to show &lt;a href=&quot;https://codepen.io/ambrwlsn90/full/eYJxmrO&quot;&gt;how custom properties are treated by browser dev tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The test case has three divs - one not using any custom properties, one using some custom properties, and one using only custom properties. Each div has exactly the same styles. Below is what the computed styles section in Chrome, Firefox and Safari dev tools shows for each div (&lt;a href=&quot;https://amberwilson.co.uk/blog/custom-property-coverup/#why-do-browsers-differ&quot;&gt;skip to next paragraph&lt;/a&gt;).&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;calculated-custom-property-results-per-browser-(chrome%2C-firefox%2C-safari)&quot;&gt;Calculated Custom Property Results Per Browser (Chrome, Firefox, Safari)
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/custom-property-coverup/#calculated-custom-property-results-per-browser-(chrome%2C-firefox%2C-safari)&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Calculated Custom Property Results Per Browser (Chrome, Firefox, Safari)&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;h3&gt;Chrome&lt;/h3&gt;&lt;p&gt;Chrome - no custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chrome - some custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chrome - only custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Firefox&lt;/h3&gt;&lt;p&gt;Firefox - no custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Firefox - some custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Firefox - only custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Safari&lt;/h3&gt;&lt;p&gt;Safari - no custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Safari- some custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Safari - only custom properties:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;198&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 255&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 133&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-left-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-right-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 128&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-left-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-right-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-top-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
    &lt;a href=&quot;https://amberwilson.co.uk/blog/custom-property-coverup/#&quot; role=&quot;link&quot;&gt;
        &lt;span role=&quot;img&quot; aria-label=&quot;up arrow&quot;&gt;&amp;uarr;&lt;/span&gt;
        &lt;span&gt;Back to the top&lt;/span&gt;
    &lt;/a&gt;
&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;why-do-browsers-differ%3F&quot;&gt;Why do browsers differ?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/custom-property-coverup/#why-do-browsers-differ%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Why do browsers differ?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;Interesting! Why is it that Safari shows all the custom properties in the computed styles list? I am not sure. In Safari they are also interactive. Clicking a computed style directs you to the location of the style and allows you to edit it in the dev tools. This is not the case in Chrome or Firefox.&lt;/p&gt;
&lt;p&gt;Does anyone know why this is?&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Where did the focus go?</title>
      <link href="https://amberwilson.co.uk/blog/where-did-the-focus-go/"/>
      <updated>Wed, 17 Jun 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/where-did-the-focus-go/</id>
      <content type="html">&lt;p&gt;There was a bug in some of my code recently. A skip link was not working correctly. When it was focused and enter was pressed, focus was placed on the main content. Seemed okay. But, when tab was pressed to go into the main content, the focus went off to some place I could not see! I spent a few minutes trying to figure it out but could not. Then, I searched for how to programatically find focus. I found I could log &lt;code&gt;document.activeElement&lt;/code&gt; into my console to do this.&lt;/p&gt;
&lt;p&gt;You can log the document&#39;s active element in any browser console by placing a &lt;code&gt;console.log&lt;/code&gt; into your JavaScript code. See the code block below for how to do this (thanks to &lt;a href=&quot;https://twitter.com/GirlsCodeMK&quot;&gt;my friend Eva&lt;/a&gt;  for teaching me this):&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;focusin&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;focused: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;activeElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Below is an image showing what such a log looks like in Firefox. It shows that the first element focused when I opened the page was a &lt;code&gt;div&lt;/code&gt;. When I moved focus to the light/dark mode toggle, the focused element was an &lt;code&gt;input&lt;/code&gt;:&lt;/p&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/where-did-the-focus-go/img/firefox-active-element-log.png&quot; alt=&quot;showing active element log in the firefox browser&quot; /&gt;
&lt;p&gt;In Chrome there is a live expression tool for logging the document&#39;s active element. The following two images show examples of this tool in action.&lt;/p&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/where-did-the-focus-go/img/active-element-link.png&quot; alt=&quot;active element that is a link&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/where-did-the-focus-go/img/active-element-toggle.png&quot; alt=&quot;active element that is a toggle&quot; /&gt;
&lt;p&gt;There are two things to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Ensuring focus is handled correctly is important for the accessibility of a web page. However, focus behaviour is not always consistent across browsers. If you&#39;re developing something and you are not sure whether focus is being handled correctly, it&#39;s a good idea to investigate by logging the document&#39;s active element.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the element that is currently focused is removed from the DOM, the focus is moved either to the document&#39;s &lt;code&gt;body&lt;/code&gt; element or becomes &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hiddedevries.nl/en/blog/2019-01-30-console-logging-the-focused-element-as-it-changes&quot;&gt;Console logging the focused element as it changes&lt;/a&gt; (Hidde de Vries)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zellwk.com/blog/inconsistent-button-behavior/&quot;&gt;Inconsistent Button Behaviour&lt;/a&gt;  (Zell Liew)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement&quot;&gt;Document or Shadow Root&lt;/a&gt;  (MDN)&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Pandemic</title>
      <link href="https://amberwilson.co.uk/blog/pandemic/"/>
      <updated>Tue, 26 May 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/pandemic/</id>
      <content type="html">&lt;p&gt;What is a pandemic anyway? I mean, why did I never actually properly learn what that term meant? There have been pandemics in the past. Sure, I know that. But were the importance of these ever conveyed to me? I can say “not really”. This is the very first pandemic-type experience I’ve ever lived through. The fact it has affected the whole world, will change some lives forever, and the behaviour of many people forever, is a mind-blowing, wonderful and deeply scary thing to me.&lt;/p&gt;
&lt;p&gt;I have been listening to a 2.5 hour &lt;a href=&quot;https://www.singularityweblog.com/ada-palmer/&quot;&gt;podcast episode where the covid-19 pandemic is being discussed&lt;/a&gt;. A woman with an astonishingly broad range of expertise, Ada Palmer, speaks briefly about two pandemics - the Swine/Spanish Flu (1918) and the Black Plague (started 1300’s and some people still get it today!). Both combined killed staggering amounts of people - even more than are being killed by the current pandemic. What if the world was exposed to a virus that was ten times more deadly than covid-19?&lt;/p&gt;
&lt;p&gt;Ada Palmer also said something that I’ve never heard someone say before. She said that if you know a lot about the past, you automatically know a lot about the future. To me, it seems like she was echoing the saying: “Those who cannot remember the past are condemned to repeat it.” - George Santayana. I am not a good historian but the saying makes sense to me. Humans, the dominant force on planet Earth, were, are, and likely forever will be, strongly governed by things like emotions and greed. Human nature is definitely a thing, and it’s not always a good thing. If human nature is more or less constant, then it makes sense that we should learn from our past behaviours and strive to behave in a way that is better for everyone in the future.&lt;/p&gt;
&lt;p&gt;My desperate hope for the outcome of the current pandemic is that humans learn as much from it as they can. That they learn ways to prevent the same or similar pandemics happening in the future. Of course they are not entirely unavoidable but I believe there are things we can collectively do to lessen their frequency and/or impact. I am hugely hopeful that humans will now be kinder to animals, and realise we absolutely need to respect animals and their natural habitats. We can reduce both blatant and secretive animal cruelty, reduce harm to the environment, reduce the influence that industry lobbyists have over everyone’s health, reduce harm to the poorest people living in environments affected by meat production, and reduce the effects of cheap, hormone-stuffed, overly-fatty meat that we absolutely do not need.&lt;/p&gt;
&lt;p&gt;What if a virus or disease 10 times more deadly than covid-19 comes along? One that kills 50% of infected people as opposed to 5%? How can we ensure that lessons about the effects of disrupted supply chains are learned, and lessons from the responses of various governments around the world are learned, and lessons from the delicate balance of safety and economy are learned? We can probably ensure these lessons are learned and discussed if the world takes them seriously. The world contains more humans than it ever has before and the number keeps on growing. The spaces between humans and their animal neighbours is shrinking, while human greed is not slowing down.&lt;/p&gt;
&lt;p&gt;Are people going to learn to live in harmony with the rest of life on Earth? Or will we continue poking holes in it until one day everything goes to shit and no amount of technological know-how or hoping or praying can save us? Humans are typically not good at delaying gratification in return for future rewards, so let’s see!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Webrings</title>
      <link href="https://amberwilson.co.uk/blog/webrings/"/>
      <updated>Fri, 15 May 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/webrings/</id>
      <content type="html"></content>
    </entry>
    
    <entry>
      <title>CSS Tips for New Devs</title>
      <link href="https://amberwilson.co.uk/blog/css-tips-for-new-devs/"/>
      <updated>Mon, 04 May 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/css-tips-for-new-devs/</id>
      <content type="html">&lt;p&gt;May the 4th be with you!&lt;/p&gt;
&lt;p&gt;If you enjoyed that greeting you&#39;ll love the nerdy stuff that is to follow. Over one evening, I wrote down some of the CSS tips I&#39;ve learned over a few years of being a developer and put them in this post &lt;span role=&quot;img&quot; aria-label=&quot;smile&quot;&gt;😃&lt;/span&gt;. I saved my most important tip for the end of the list. Enjoy!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CSS stands for Cascading Style Sheets. This means that they are style sheets that cascade. &lt;a href=&quot;https://wattenberger.com/blog/css-cascade&quot;&gt;Take a look at this brilliant site on the CSS cascade (that has quizzes!)&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Various online games have been made to help people learn CSS and they are amazing to this day! &lt;a href=&quot;https://flexboxfroggy.com/&quot;&gt;https://flexboxfroggy.com/&lt;/a&gt; for Flexbox, &lt;a href=&quot;https://cssgridgarden.com/&quot;&gt;https://cssgridgarden.com/&lt;/a&gt; for Grid, and &lt;a href=&quot;https://flukeout.github.io/&quot;&gt;https://flukeout.github.io/&lt;/a&gt; for CSS selectors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One part of the CSS Cascade is Specificity. HTML elements can be styled in a number of ways. Some of your styles may be overridden depending on the way you&#39;ve targeted your element for styling. Writing inline styles will override any style in a stylesheet. An &lt;code&gt;id&lt;/code&gt; on an element will override a &lt;code&gt;class&lt;/code&gt;, and a &lt;code&gt;class&lt;/code&gt; will override targeting the element directly. In the spirit of the day this blog post was created, &lt;a href=&quot;https://stuffandnonsense.co.uk/archives/css_specificity_wars.html&quot;&gt;see this post on calculating CSS specificity - Star Wars edition!&lt;/a&gt; Note that Many CSS-in-JS libraries are designed to take care of specificity issues for you by scoping styles to single files. It still absolutely pays to learn about it though!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&#39;s not a good idea to fix shortcomings in your HTML with CSS. Fix your HTML first!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are pseudo elements in HTML that can also be styled and provide handy hacks when it comes to styling elements. The most well-known are &lt;code&gt;::before&lt;/code&gt; and &lt;code&gt;::after&lt;/code&gt;, but there are &lt;a href=&quot;https://blog.logrocket.com/a-guide-to-css-pseudo-elements/&quot;&gt;seven pseudo elements in total&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSS allows organisation of elements on web page. There are even some layout systems - the most well-known include  Grid, Flexbox, floats and table (in order from newest to oldest).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If your project&#39;s browser support allows, definitely try some of the newest CSS out there, e.g. Grid. If people are too afraid to try new CSS even if it doesn&#39;t have full browser support yet, then nobody would ever try it out! Check browser support with &lt;a href=&quot;https://caniuse.com/&quot;&gt;https://caniuse.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elements on a web page can be sized and spaced using quite a number of different values. There are &lt;code&gt;px&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;s, &lt;code&gt;rem&lt;/code&gt;s, &lt;code&gt;ch&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;, &lt;code&gt;vh&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, etc. When building more complex web pages, the interplay of element sizing or spacing values can make a big difference in the ease and maintainability of styles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For every shorthand way of writing CSS, it&#39;s more than likely that there is a long-hand way to write it. E.g. &lt;code&gt;margin: 20px 30px 10px 15px&lt;/code&gt; can be &lt;code&gt;margin-right: 30px&lt;/code&gt;, &lt;code&gt;margin-left: 15px&lt;/code&gt;, &lt;code&gt;margin-top: 20px&lt;/code&gt;, &lt;code&gt;margin-bottom: 10px&lt;/code&gt;. Writing the long-hand version can sometimes be clearer for other developers reading your CSS!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can change CSS right in your browser&#39;s dev tools (to open them, right click the browser window and choose &amp;quot;inspect&amp;quot; or &amp;quot;inspect element&amp;quot;). The great thing is, none of the styles will be saved so you can experiment here! Another great thing about the dev tools is the &amp;quot;computed styles&amp;quot; tab, because this shows you exactly what styles are currently applied to an element. This can be really helpful when it comes to debugging your CSS!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As well as computed styles, the dev tools will also show the layout styles, giving you a clear indication what margin, padding and borders are applied to an element.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/&quot;&gt;Stack Overflow&lt;/a&gt; and &lt;a href=&quot;https://css-tricks.com/&quot;&gt;CSS Tricks&lt;/a&gt; are two of your CSS-related-questions friends (but beware of outdated answers).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the MDN docs for up-to-date CSS documentation. They even have some live playgrounds for many CSS properties - e.g. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transform&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/transform&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It pays to learn about position relative and absolute. By this I mean parent elements with  &lt;code&gt;position: relative&lt;/code&gt; that have child (nested) elements with &lt;code&gt;position: absolute&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A web page tends to consist of a lot of different-sized boxes. Every element is actually viewed as a box by the browser - headings, paragraphs, spans, everything. Each box consists of 4 things - the element&#39;s content, its padding, margin and border. By default, the box model states that any border or padding you add to an element will be added on top of the element&#39;s width or height. This can be confusing or counterintuitive. Setting &lt;code&gt;box-sizing: border-box&lt;/code&gt; tells elements not to grow in width or height when border or padding is added. Instead, the content size is adjusted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t remove the default browser focus outlines unless you are &lt;em&gt;sure&lt;/em&gt; you are managing your own focus state correctly. Removing the outlines could prevent a user from being able to navigate your site using assistive technology or the keyboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are a lot of CSS preprocessors that allow you to generate (compile) CSS using their own unique syntax, which often offers a way to write CSS in a more organised, shorter or functional way. Beware using preprocessors, as they can be overkill for many projects, create over-sized compiled CSS, or make CSS hard to refactor in the future. Examples of preprocessors include Sass, Less, and Stylus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSS custom properties (aka CSS variables) are a way for developers to move away from CSS preprocessors and still get the benefits. They allow you to define specific values under a variable name. These variables can be used on any number of elements and if the value needs to change, it only has to be changed in one place. E.g. a variable containing a large font size such as &lt;code&gt;--fontSizeL: 150%&lt;/code&gt; can be used on many different elements like this: &lt;code&gt;font-size var(--fontSizeL)&lt;/code&gt;. If the value needs to change to &lt;code&gt;140%&lt;/code&gt;, it can be done once quickly and easily. There is no support for Internet Explorer, but polyfills exist to get around this!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSS has a lot of weird quirks that you’d not think of. If you don’t know why some CSS is not doing what you want, feel free to search for the reason. Just a couple of examples include images being &lt;code&gt;display: inline-block&lt;/code&gt; so that they have an implicit bottom spacing, or that you need to set &lt;code&gt;min-width: 0&lt;/code&gt; on flex items to stop the items from growing infinitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSS doesn&#39;t have to be overly complex. There is most often a simple solution to a styling problem. I can&#39;t tell you how many times I have over-used CSS and hacked a fragile solution together. If I had looked at the DOM (document object model - something you can see within your dev tools) and thought about what was happening properly, I could&#39;ve saved myself time and many lines of unmaintainable CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As with all programming (and to non-believers, yes, CSS is programming &lt;span role=&quot;img&quot; aria-label=&quot;wink&quot;&gt;😉&lt;/span&gt;), if your head is too far into the CSS you’ve been doing, take a break and go back to it later. It can work wonders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/the-languages-which-almost-became-css/&quot;&gt;Check out some blog posts about the history of CSS&lt;/a&gt; and who works on it today. There is still an active CSS working group thinking about the future of CSS!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://rachelandrew.co.uk/archives/2016/09/13/why-there-is-no-css4-explaining-css-levels/&quot;&gt;You may have heard of CSS3, but don&#39;t hold your breath for CSS4.&lt;/a&gt; The CSS working group is working on different CSS feature modules, each of which have their own &#39;levels&#39; or version numbers, e.g. Flexbox version 1, or selectors level 4, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSS expertise comes with time! While CSS is easy to start with and gives you immediate visual results, mastering it takes time and this is perfectly okay  &lt;span role=&quot;img&quot; aria-label=&quot;smile&quot;&gt;😃&lt;/span&gt;. It is the same for everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Accessible HTML Elements</title>
      <link href="https://amberwilson.co.uk/blog/accessible-html-elements/"/>
      <updated>Thu, 19 Mar 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/accessible-html-elements/</id>
      <content type="html">&lt;section&gt;
&lt;p&gt;The goal of this post is to highlight a handful of useful HTML elements for improving a page&#39;s accessibility, and show that every developer can learn about and write accessible HTML!&lt;/p&gt;
&lt;p&gt;You may be aware that ARIA roles are often used with HTML elements. I haven&#39;t written about them here, as it&#39;s good to see how HTML written without ARIA can still be accessible. I&#39;ll write a separate post describing the combination of HTML elements, ARIA, and landmarks.&lt;/p&gt;
&lt;p&gt;An important thing to remember is that HTML is the semantic structure (like a skeleton) of a web page, and is not for styling. Elements such as &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;em&amp;gt;&lt;/code&gt; do alter styles, but also have semantic meaning.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;contents&quot;&gt;Contents
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#contents&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Contents&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#section-heading&quot;&gt;Section Heading (h1-h6)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#paragraph&quot;&gt;Paragraph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#lists-and-list-item&quot;&gt;Ordered List, Unordered List, and List Item&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#description-list&quot;&gt;Description List, Description Term, and Description Details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#time-and-datetime&quot;&gt;Time and datetime (attribute)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;section-heading-(h1-h6)&quot;&gt;Section Heading (h1-h6)
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#section-heading-(h1-h6)&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Section Heading (h1-h6)&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;My Cool Page&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Read about this&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;This is great because...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;More reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Even more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About even more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Read about that&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;That is great because...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;More reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Even more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About even more reasons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Section heading levels are an important part of a web page&#39;s HTML structure. They allow screen reader users to effectively &amp;quot;see&amp;quot; a web page as a tree of contents. This allows content to be navigated much more quickly and easily.&lt;/p&gt;
&lt;p&gt;If section headings are skipped, e.g. a fourth level heading is used before a second level heading in the same section of the page, screen reader users can become confused when trying to work out the page&#39;s contents and structure. However, as shown in the above block of code there are third level headings followed by a second level heading. This is fine because section headings can be nested. Here, the third level headings act like subsections of the second level headings.&lt;/p&gt;
&lt;p&gt;A great way to check the heading structure of a web page is by using the &lt;a href=&quot;https://validator.w3.org/&quot;&gt;W3C Validator&lt;/a&gt;. First, add some HTML via URL, file upload or direct input. Then, open the &#39;More options&#39; dropdown and select the &#39;Show outline&#39; checkbox option. Then, click or tap the &#39;Check&#39; button. Finally, select the &#39;outline&#39; checkbox. Right at the bottom of the page should be the HTML&#39;s heading-level and structural outlines, similar to the following image:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/img/heading_level_outline.png&quot; alt=&quot;heading level and structural outlines from W3C Validator website&quot; /&gt;
&lt;em class=&quot;image-caption&quot;&gt;Heading-level and section-level outline output from &lt;a href=&quot;https://validator.w3.org/&quot;&gt;W3C Validator&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Another site for checking outlines with is the &lt;a href=&quot;https://gsnedders.html5.org/outliner/&quot;&gt;HTML 5 Outliner&lt;/a&gt;!&lt;/p&gt;
&lt;div class=&quot;heading-with-siblings&quot;&gt;
  &lt;h2 id=&quot;paragraph&quot;&gt;Paragraph&lt;/h2&gt;&amp;nbsp;
  &lt;a href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#paragraph&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;
&lt;/div&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content that you can skip.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content that was skipped to!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Breaking content into paragraphs is another way to section content. Screen reader users can skip forward or backward between paragraphs, improving the navigability of a page. Using empty paragraphs for visual spacing or for any other styling consideration tends to hurt accessibility. This is because screen readers will announce even empty paragraphs, which can confuse users.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;ordered-list%2C-unordered-list%2C-and-list-item&quot;&gt;Ordered List, Unordered List, and List Item
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#ordered-list%2C-unordered-list%2C-and-list-item&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Ordered List, Unordered List, and List Item&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Item 1&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Do something with item 1.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Do another thing with item 1.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Item 2&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Item 3&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Unordered item&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Unordered item&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Unordered item&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An ordered list (&lt;code&gt;ol&lt;/code&gt;) can provide a numerical list and an unordered list (&lt;code&gt;ul&lt;/code&gt;) can provide a bullet-point list. These elements are used to wrap list item (&lt;code&gt;li&lt;/code&gt;) elements. Ordered and unordered lists can be nested within each other and will still be accessible.&lt;/p&gt;
&lt;p&gt;Screen readers know to announce nested or unnested &lt;code&gt;ol&lt;/code&gt; or &lt;code&gt;ul&lt;/code&gt; elements as a list, and &lt;code&gt;li&lt;/code&gt; as a list item. If an element other than &lt;code&gt;ol&lt;/code&gt;, &lt;code&gt;ul&lt;/code&gt;, or &lt;code&gt;li&lt;/code&gt; is used to create a list, a screen reader will not recognise the list or any list items. In this case, ARIA roles can help. However, it&#39;s definitely best to use the correct, semantic HTML element wherever possible.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;description-list%2C-description-term%2C-and-description-details&quot;&gt;Description List, Description Term, and Description Details
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#description-list%2C-description-term%2C-and-description-details&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Description List, Description Term, and Description Details&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Phone:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;0123 456 789&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Email:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;email@email.com&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hours:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Monday to Friday 9am-5pm&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any key-value-paired information fits well inside a description list (orginially known as a definition list).&lt;/p&gt;
&lt;p&gt;The three elements &lt;code&gt;dl&lt;/code&gt;, &lt;code&gt;dt&lt;/code&gt;, and &lt;code&gt;dd&lt;/code&gt; are designed to be used together. In a description list, &lt;code&gt;dt&lt;/code&gt; represents the key and &lt;code&gt;dd&lt;/code&gt; gives the value of that key. For styling, adding microdata or other attributes, it is allowed (although some see this as a grey area) to wrap each key-value pair in a &lt;code&gt;div&lt;/code&gt; element. You can use more than one &lt;code&gt;dt&lt;/code&gt; element with a &lt;code&gt;dd&lt;/code&gt; element.&lt;/p&gt;
&lt;p&gt;A few screen readers such as VoiceOver for iOS will not announce these elements as lists (see &lt;a href=&quot;https://cdpn.io/aardrian/debug/NzGaKP&quot;&gt;how description lists are treated differently&lt;/a&gt;). Because of this, it&#39;s important to make sure each list item makes sense in the context of the other list items. Don&#39;t at all be put off that some screen readers do not announce these elements properly. Think of how many other screen reader users will still benefit.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;time-and-datetime-(attribute)&quot;&gt;Time and Datetime (attribute)
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/accessible-html-elements/#time-and-datetime-(attribute)&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Time and Datetime (attribute)&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  We first opened our doors at &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;time&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;2018-07-20T09:00:00Z&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;9am on 20th July 2018&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  for &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;time&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;PT2H00M&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;2 hours&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;time&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;, as a trial.
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;time&lt;/code&gt; element is used with the &lt;code&gt;datetime&lt;/code&gt; attribute. This attribute&#39;s value can take formats such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YYYY-MM-DDThh:mm:ssZ&lt;/li&gt;
&lt;li&gt;PTDHMS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See these used in the example code block above.&lt;/p&gt;
&lt;p&gt;The datetime value can provide a standardised, machine-readable date or time that can be accessed by assistive technology. The human-readable date or time can be placed between the &lt;code&gt;time&lt;/code&gt; element.&lt;/p&gt;
&lt;p&gt;There are quite a few ways to provide a valid datetime value so I won&#39;t list them all here. However, there are available resources on the web for checking this. If a page uses JavaScript, then one great resource for creating dates is &lt;a href=&quot;https://date-fns.org/&quot;&gt;date-fns&lt;/a&gt;. As with all JS libraries, it&#39;s really good to check that the HTML it outputs is accessible and semantic.&lt;/p&gt;
&lt;/section&gt;
</content>
    </entry>
    
    <entry>
      <title>ARIA labels</title>
      <link href="https://amberwilson.co.uk/blog/aria-labels/"/>
      <updated>Fri, 14 Feb 2020 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/aria-labels/</id>
      <content type="html">&lt;p&gt;Recently, I&#39;ve been chatting about accessibility with two of the biggest experts on the subject. Also, the web developers I work with at &lt;a href=&quot;https://n26.com/en-eu&quot;&gt;N26&lt;/a&gt; take accessibility very seriously. This got me interested enough to read some blog posts on the subject. Many of these posts mentioned &#39;landmark roles&#39; - one of which is &#39;navigation&#39;. The navigation landmark is for identifying groups of links that help users navigate around a site, or within a page. You can give an HTML element a role of navigation (please see code block below):&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Main navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- list of links --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, the &lt;code&gt;nav&lt;/code&gt; element in HTML is automatically assigned &lt;code&gt;role = navigation&lt;/code&gt;, making it the best element for creating navigation sections. It is always best to use native, semantic HTML elements where possible, to avoid writing too much &lt;code&gt;ARIA&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For developing the N26 web app, we use &lt;a href=&quot;https://github.com/juliettepretot/agnostic-axe&quot;&gt;agnostic axe&lt;/a&gt; to warn us when accessibility is not up to scratch. In my console, it notified me of the following:&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;New aXe issues
moderate: Ensures landmarks are unique https://dequeuniversity.com/rules/axe/3.5/landmark-unique?application=axeAPI
Element: &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;​…​&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;​&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I knew from my reading that this warning came from having two &lt;code&gt;nav&lt;/code&gt; elements (i.e. two elements with &lt;code&gt;role=navigation&lt;/code&gt;) on the same page. The &lt;code&gt;nav&lt;/code&gt; elements need to be distinguished from each other in some way. This is where &lt;code&gt;aria-label&lt;/code&gt; and &lt;code&gt;aria-labelledby&lt;/code&gt; come in.&lt;/p&gt;
&lt;p&gt;My first attempt at a fix involved using &lt;code&gt;aria-label&lt;/code&gt; (please see code block below):&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Text describing the purpose this navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;​…&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Text describing the purpose this navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;​…&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Whatever value is given to &lt;code&gt;aria-label&lt;/code&gt; will be accessible to screen reader users, making it much easier to understand a HTML page&#39;s structure and purpose. The labels should provide a concise description of what each navigation element contains.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;tricky-translations&quot;&gt;Tricky translations
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/aria-labels/#tricky-translations&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Tricky translations&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;After using &lt;code&gt;aria-label&lt;/code&gt;, the warning was gone from my console! Was I all done? I could have been. However, I soon learned something else. Some translation systems (e.g. Google translate) might not translate the value of &lt;code&gt;aria-label&lt;/code&gt;. Luckily, there is a way around this (please see code block below):&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-labelledby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    Text describing the purpose this navigation
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-labelledby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;secondary-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;secondary-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    Text describing the purpose this navigation
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, an &lt;code&gt;aria-labelledby&lt;/code&gt; value of a &lt;code&gt;nav&lt;/code&gt; matches the &lt;code&gt;id&lt;/code&gt; value of an &lt;code&gt;h2&lt;/code&gt;. The &lt;code&gt;h2&lt;/code&gt; contains human-readable text. It is this text that will be accessible to screen reader users. The element containing this text can also be a hidden element which exists purely for screen readers. In this case, the hidden element of course still needs text content. This method has an advantage over &lt;code&gt;aria-label&lt;/code&gt; in that the human-readable content is contained in a text node rather than an attribute. Text nodes are easier for some translation systems to access.&lt;/p&gt;
&lt;p&gt;I learned all of this today and I am very grateful for the knowledge. Now I know it, I&#39;ll be able to apply it wherever needed in my HTML.&lt;/p&gt;
&lt;p&gt;For more information, check out this post on the &lt;a href=&quot;http://html5doctor.com/nav-element/&quot;&gt;navigation element&lt;/a&gt; from html5 doctor.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What Makes a Mid-Level Developer?</title>
      <link href="https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/"/>
      <updated>Wed, 02 Oct 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/</id>
      <content type="html">&lt;figure class=&quot;blog-image&quot;&gt;
  &lt;img src=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/img/hugues-de-buyer-mimeure.jpg&quot; alt=&quot;girl walking on paw prints&quot; /&gt;
  &lt;figcaption&gt;Image by &lt;a class=&quot;single-link-light&quot; href=&quot;https://unsplash.com/@huguesdb&quot;&gt;hugues-dbm&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I was recently asked by more than one junior developer about how to progress to a mid-level developer. As a junior developer looking to move towards a mid role myself, I wanted to collect a few of my thoughts in a blog post. This isn&#39;t a checklist of skills that a workplace might typically give you. Instead, it&#39;s a collection advice from my own, lived experiences!&lt;/p&gt;
&lt;p&gt;I&#39;ve worked for nearly two years as a front end web developer in a multidisciplinary team. Currently, I work on a product that requires me to handle API data, authentication, localisation etc. This isn&#39;t the case for every front end developer. No one developer has the same experience as another.&lt;/p&gt;
&lt;p&gt;So, please see this post as a list of suggestions and not as a complete to-do list on how to progress in your career :)&lt;/p&gt;
&lt;p&gt;I&#39;ve organised my thoughts into three categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#non-technical-skills&quot;&gt;Non-technical skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#current-skills&quot;&gt;Current skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#skill-focus&quot;&gt;Skill focus&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;non-technical-skills&quot;&gt;Non-technical skills
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#non-technical-skills&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Non-technical skills&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;As a junior it should be expected that you get better at writing code, and spend most of your time writing it. You should also get feedback on your learning and performance and be helped to get better. Becoming a mid-level developer involves spending more time on things that don&#39;t involve writing code. You should spend more time looking at the bigger picture of a project. In other words, it will become more important to look at how all parts of a project (that are worked on by every member of the team) fit together, rather than focusing solely on your own, separate coding tasks.&lt;/p&gt;
&lt;h3&gt;Writing well-structured code&lt;/h3&gt;&lt;p&gt;Writing code is one thing, but paying attention to how well it is structured is another. It&#39;s worth taking time to write code that is as clear to others as it is to you three months after you wrote it. Practice this by breaking down the logic in the code you (and others) write. Try seeing where a feature originates, how and where data flows into it along the way, and what the end result is. Note the architecture down in a notepad, or explain to another developer (or rubber duck). This will show how well you understand what the code does and where improvements can be made.&lt;/p&gt;
&lt;p&gt;The advantage of well-structured code is that it creates a codebase that is easier to traverse and understand. This helps you make better and more confident decisions about a project, reducing stress and confusion for yourself and your team. It also limits mistakes and technical debt - meaning there is less need for refactoring or necessary re-writing of code that was poorly written.&lt;/p&gt;
&lt;h3&gt;Encouraging better communication&lt;/h3&gt;&lt;p&gt;Paying attention to your team&#39;s communication patterns means you notice unhelpful patterns when they appear. A &lt;a href=&quot;https://www.mountaingoatsoftware.com/agile/scrum/meetings/sprint-retrospective&quot;&gt;retrospective&lt;/a&gt; is a good place to suggest ways to improve. My team at work noticed that there were pockets of smaller conversations happening between some team members. This resulted in information getting lost and not everyone being informed. So, we began documenting the results of meetings, no matter who they include, both in our team’s main communication tool, and on our story tickets.&lt;/p&gt;
&lt;p&gt;Spending time thinking about and implementing ways to improve communication has helped everyone in my team to understand project requirements quicker and easier. Another thing that was noticed is that we rely a lot on other teams for some features, whether design, marketing, product or back-end related. Our features can be slow to progress when we do not make an effort to talk with other teams about deadlines and requirements.&lt;/p&gt;
&lt;p&gt;No team can have perfect communication, but we continue striving to become even better at documenting information and informing everyone involved in a feature of necessary info.&lt;/p&gt;
&lt;h3&gt;Taking ownership of work&lt;/h3&gt;&lt;p&gt;Taking ownership of your work brings a lot of benefits, and it should happen right from the beginning of a project. Be as involved as you can in decision making during planning meetings. This limits the work others have to do and reduces the chance of decisions being made that will slow the whole project down. It encourages you to do more than the minimum required to finish a feature.&lt;/p&gt;
&lt;p&gt;Both when planning and implementing tasks, try taking some time to find out how similar features have been implemented. Think about how your tasks fit into those of other people, and whether you need to collaborate on something. Remember that taking this time is expected of you as a more experienced developer. Spending less of your time coding than you used to doesn&#39;t mean you&#39;re failing.&lt;/p&gt;
&lt;p&gt;Spending less time coding and more time thinking about how best to approach a feature actually saves time in the long run. Creating features that are robust and well-thought-through helps you and your team feel much more in control and able to move onto new features faster.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;current-skills&quot;&gt;Current skills
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#current-skills&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Current skills&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;This list covers both technical &lt;em&gt;and&lt;/em&gt; non-technical skills that I&#39;ve already begun using as a junior. If I&#39;d gone into depth on them it would have made this post five times longer. Still, I think it&#39;s fairly easy to grasp their importance. I find it really valuable to remind myself of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing tests to make both refactoring &lt;em&gt;and&lt;/em&gt; finding bugs much, much easier.&lt;/li&gt;
&lt;li&gt;Paying attention to error logs, learning to read them, and using them to find the origin of bugs.&lt;/li&gt;
&lt;li&gt;Asking questions about WHY things are implemented the way they are and not another way.&lt;/li&gt;
&lt;li&gt;Asking questions about anything that is not clear.&lt;/li&gt;
&lt;li&gt;Looking closely at code that has already been written, by you or others, and suggesting refactoring changes (if needed) to make it clearer and less prone to breaking in the future.&lt;/li&gt;
&lt;li&gt;Reading your project&#39;s code styleguide/docs and making sure the codebase adheres to the rules stated there.&lt;/li&gt;
&lt;li&gt;Suggesting/implementing updates to current documentation (especially since docs can get out of date relatively quickly).&lt;/li&gt;
&lt;li&gt;Taking time to review other peoples&#39; code.&lt;/li&gt;
&lt;li&gt;Trying several methods of approaching a problem, discussing the pros and cons, and choosing the method that makes most sense at the time.&lt;/li&gt;
&lt;li&gt;Making sure to spend plenty of time not coding, so that you get a rest, and have more fun when actually coding.&lt;/li&gt;
&lt;/ul&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;skill-focus&quot;&gt;Skill focus
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/what-makes-a-mid-level-developer/#skill-focus&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Skill focus&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;h3&gt;Finding what to focus on&lt;/h3&gt;&lt;p&gt;When it comes to skills, maybe you&#39;ve had similar thoughts to me - now I am good at quite a few things. I am feeling quite proud of myself, even. What a nice feeling! Now, how can I get &lt;em&gt;really&lt;/em&gt; good at something? Can I dig down into something and become a bit of an expert in it? Is there a point in that? Yes! I&#39;ve been told by more than one person that this is a good idea. Why? Mainly because web development is a huge field, so it is not possible for someone to be good at, or enjoy, everything.&lt;/p&gt;
&lt;p&gt;Maybe you have a good idea of what you are particularly good at as a developer. Maybe you have an almost intuitive feeling on what you&#39;re most interested in. Could be accessibility, performance, security, whatever. Whether you know what you are most interested in or not, I am guessing you may feel like you don&#39;t have much time to really focus on coding that much outside of work.&lt;/p&gt;
&lt;p&gt;It&#39;s a good idea to let your colleagues at work know where you&#39;d like to focus. Your workplace should take an interest in helping and supporting you in getting better at the things you like most. That&#39;s not to say you should drop your efforts to learn things outside of your fave topics. It&#39;s about finding some extra time to focus more deeply on such topics. At my work one developer interested in accessibility has set up weekly mentoring meetings around it, and recently begun holding a series of presentations on it.&lt;/p&gt;
&lt;p&gt;This sounds like a lot of pressure, but don&#39;t worry. The things we are most interested in might totally change from one month to the next, and that&#39;s fine. Life is short and coding should be something you enjoy, especially if its your job. So take deeper dives into things you enjoy and feel you can handle. You might end up diving into some things more than others. Even if your learning was unplanned, it&#39;s all good.&lt;/p&gt;
&lt;h3&gt;Finding your developing style&lt;/h3&gt;&lt;p&gt;Aside from specific topics, take a look at your strong points as a developer that involve your approach to development as a whole. Some people&#39;s style might be that they are good at coding many things in a short space of time and taking a trial-and-error approach. Others may prefer to study a concept for a few hours and take a more measured approach. Some leave the coding to others but tend to be very good problem solvers. A few may be particularly good at explaining coding concepts.&lt;/p&gt;
&lt;p&gt;Most developers are a mix of a number of the things mentioned above. The web team at my work contains people who fit into the points I made above and this is a good thing. It&#39;s an advantage to have a web team containing people with different strengths, because these strengths can complement each other.&lt;/p&gt;
&lt;p&gt;No one developer can know everything, and no one developer can be good at everything. My advice is to find the things you like doing most, find how you like doing them most, and still challenge yourself to learn new things &lt;em&gt;some&lt;/em&gt; of the time ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In conclusion to this post, I want to remind you (and myself) that everyone started at the beginning. We all still feel imposter syndrome and shame when things go wrong. We are all learning all the time, which can be exhausting, so don&#39;t beat yourself up for not knowing something. We all need to hear stories from and support each other so please share your experiences with people too. No developer has to be alone!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Imperative and Declarative Programming</title>
      <link href="https://amberwilson.co.uk/blog/imperative-declarative-programming/"/>
      <updated>Sun, 28 Jul 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/imperative-declarative-programming/</id>
      <content type="html">&lt;p&gt;In spoken languages, the imperative is used to express commands/give orders. This helps me remember how programming languages use the imperative.&lt;/p&gt;
&lt;p&gt;In programming languages like JavaScript the &lt;strong&gt;imperative&lt;/strong&gt; is used for giving orders that describe to the computer &lt;strong&gt;how&lt;/strong&gt; to do something! An example of imperative programming in JavaScript is a &lt;code&gt;for&lt;/code&gt; loop that does something to items in an array. Check out the comments in the code below that represent what the computer is being ordered to do:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catRatingOutOfTen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Create a variable containing an empty array.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; accurateCatRating &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Create a variable called i and give it a value of 0. Run a loop and,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// each time, increase i by 1. Only loop while i is less than the number&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// of items in the catRatingOutOfTen array.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; catRatingOutOfTen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Take catRatingOutOfTen array item number &quot;i&quot; out of the catRatingOutOfTen&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// array and multiply it by 2.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newRating &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; catRatingOutOfTen&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Append the calculated value to the end of the accurateCatRating array&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// initialised earlier.&lt;/span&gt;
  accurateCatRating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newRating&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accurateCatRating&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// [20, 24, 30, 28, 22, 26]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quite verbose, eh? However, looping through an array can also be done in a &lt;strong&gt;declarative&lt;/strong&gt; way! The &lt;code&gt;map()&lt;/code&gt; method is one way - it states &lt;strong&gt;what&lt;/strong&gt; the code does, and lets the computer figure out the &lt;strong&gt;how&lt;/strong&gt; to do it. In spoken languages, the declarative deals with informative statements. The computer can be told &lt;strong&gt;what&lt;/strong&gt; code is supposed to do, and be allowed to figure out &lt;strong&gt;how&lt;/strong&gt; to do it by itself. Check out the comment below:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catRatingOutOfTen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// accurateCatRating is a new array consisting of each item of the catRatingOutOfTen&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// array mapped out and multiplied by 2.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; accurateCatRating &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; catRatingOutOfTen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accurateCatRating&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// [20, 24, 30, 28, 22, 26]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quite a nice shortcut, isn&#39;t it? Declarative programming is a powerful way to write less verbose code. Since declarative programming is more abstract than imperative programming, it can take longer to learn and understand what declarative programming does under the hood. We often cannot immediately see exactly &lt;strong&gt;how&lt;/strong&gt; declarative code works and creates its results. But once we understand how declarative code works, it can help us achieve in a shorter time what we would have achieved by instructing the computer step-by-step how we need it to do something.&lt;/p&gt;
&lt;p&gt;JavaScript ES6 syntax allows an even more declarative way to get the &lt;code&gt;accurateCatRating&lt;/code&gt;. Check it out below - the function declaration has been shortened with an arrow function, which makes an implicit return possible:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catRatingOutOfTen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; accurateCatRating &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; catRatingOutOfTen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;accurateCatRating&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// [20, 24, 30, 28, 22, 26]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A lot of popular and powerful libraries, such as d3.js, Zdog, and GSAP take advantage of the declarative programming style for abstracting away logic and allowing cool things to be achieved with less code.&lt;/p&gt;
&lt;p&gt;Please check out the &lt;a href=&quot;http://latentflip.com/imperative-vs-declarative&quot;&gt;super good article&lt;/a&gt; on imperative and declarative programming by &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;Philip Roberts&lt;/a&gt; that inspired me to write this post!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Giving Back</title>
      <link href="https://amberwilson.co.uk/blog/giving-back/"/>
      <updated>Mon, 10 Jun 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/giving-back/</id>
      <content type="html">&lt;p&gt;
    &lt;/p&gt;&lt;blockquote&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/Sareh88?ref_src=twsrc%5Etfw&quot;&gt;@Sareh88&lt;/a&gt; wants to set us a challenge - giving back to the web community. Can you think about the things people have done to help you? Is there a way you can give the gift of your support to help support those who need it as much as you once did? &lt;a href=&quot;https://twitter.com/CSSconfeu?ref_src=twsrc%5Etfw&quot;&gt;@CSSconfeu&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/CSSconfEU2019?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#CSSconfEU2019&lt;/a&gt;&lt;/p&gt;&amp;mdash; Amber Wilson (@ambrwlsn90) &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/1134495799134621696?ref_src=twsrc%5Etfw&quot;&gt;May 31, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;What is giving back? It can mean so many things.&lt;/p&gt;
&lt;p&gt;What have people done for me? How did I go from wondering what next step to take after a masters degree in psychology to working on a challenging and exciting web app, being flown out to amazing places to speak, and getting involved in a truly incredible community that has taught me so much not only about tech but also about myself?&lt;/p&gt;
&lt;p&gt;The answer lies in the support that others have given me. People have given up their time to coach me, extensively mentored me, promptly answered my slack and twitter messages, invited me to speak at a conference even though I never had before, given me scholarship tickets to conferences, given me feedback, given me step-by-step instructions over video chat to build something I couldn’t have done alone, offered me extended 1-on-1 time to focus on a topic I want to improve, gone out of their way to help me feel comfortable, given me free books and online learning materials, organised free workshops, given me kind and supportive words, assured me that I have what it takes to succeed, made me feel my non-technical skills are highly valued, etc. &lt;strong&gt;By the way, if you are one of these people, thank you &lt;em&gt;so&lt;/em&gt; much.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am thrilled to have the chance to give something back since I began getting paid to be a developer, and that’s helping to organise &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt;. Doing so is a way of thanking everyone who has helped lift me to where I am today and helping to give other people the same support as I received. But it’s actually only one way of giving back. Not everyone has to organise meet ups or put in a large time commitment in order to help others. Small things such as giving a supportive word, taking a moment to give someone feedback, or checking your privilege to help ensure everyone has the chance to feel comfortable and accepted, can help others so much more than you may think.&lt;/p&gt;
&lt;p&gt;I have heard concerns from people who’d like to give back but are unsure how to, or nervous that their attempts at helping would not really help at all. If you feel this way, I can assure you that this is very rarely the case. At codebar we often get emails from developers who’d like to try coaching but worry they’d be terrible at it and end up boring their student rather than helping. Firstly, we direct them to our common-sense &lt;a href=&quot;https://codebar.io/code-of-conduct&quot;&gt;code of conduct&lt;/a&gt;, and our &lt;a href=&quot;https://codebar.io/effective-teacher-guide&quot;&gt;coach guidelines&lt;/a&gt;. Secondly, we reassure them that students would be thrilled with any sort of support given, whether it be technical, or something more like career advice or sharing stories. A really cool thing is that we have so many returning coaches at codebar who love coming along, which shows that they also get something from the experience.&lt;/p&gt;
&lt;p&gt;I can very safely say that without the people who have given either a little or a lot of their time to me over the past two years, I wouldn’t be where I am today or have the confidence going forward to achieve even more in the future. I owe my success to the combination of all the little bits of support that people have given me. I am very much &lt;a href=&quot;https://twitter.com/fredericmarx/status/1134420125199863810&quot;&gt;community-taught&lt;/a&gt;, and not self-taught. Being in tech can sometimes feel extremely overwhelming and also lonely. The best way to give back is by getting involved in the tech community, and offering your kind words and using any privilege you may have in order to support your fellow humans. You will lift others up and make them feel fantastic, and it&#39;ll lift you up as well (that&#39;s a promise). Win-win, I would say 😊&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The Big Picture</title>
      <link href="https://amberwilson.co.uk/blog/the-big-picture/"/>
      <updated>Thu, 25 Apr 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/the-big-picture/</id>
      <content type="html">&lt;p&gt;I think it’s important for junior developers to learn to see the bigger picture in projects. However, this can be hard for new developers, particularly those with no computer science background. I have been told by experienced developers that the ability to see the bigger picture comes with time and working on multiple large projects. As a junior developer who is looking to transition to mid-level, I feel more and more aware that I still occasionally miss the bigger picture. I also think this is something that can be improved over time. To do this, I have to be aware of it and its importance.&lt;/p&gt;
&lt;p&gt;It’s important to see the big picture because it will inform how developers write their code. If they understand that code needs to be maintained in the long run, and needs to be flexible and scalable, they will feel more motivated to write their code in a particular way. Naming and commenting are good examples of this. The way components, variables and files are named and commented is quite crucial to the maintainability and understandability of a codebase in the long run - and not only for the team but also for the developer who writes the code in the first place.&lt;/p&gt;
&lt;p&gt;Seeing the big picture is very useful when it comes to naming code. Here are a couple of examples: 1. An API used as a proxy should be, in effect, ‘dumb’. It should not be named in such a way that suggests it is connected to another part of the codebase. It should be named for the purpose it serves and nothing else. When the API is used in a codebase, then it can be customised to fit the codebase’s purpose. 2. An icon should be named according to a decided pattern. One suggestion could be to name icons for what they are - e.g. a box with a shadow could be &lt;code&gt;ShadowBox&lt;/code&gt;. In this case, any new icons added to the codebase should not be named for what page they are on or what function they serve. Both of these examples will help keep the codebase clear and understandable for developers who use it.&lt;/p&gt;
&lt;p&gt;If a piece of code is complex, it pays to comment why it is there and why the code was not written in an alternative (and to the uninformed eye, a different but equally good way). People will thank you tremendously and you will thank yourself even more strongly for taking the time to comment code.&lt;/p&gt;
&lt;p&gt;To conclude, I think it can be hard for new developers, particularly those coming from a non-computer background, to see the big picture. Most beginner projects that new developers can do by themselves also do not give the aspiring developer a very good idea of what it means to scale a project. Due to this, I think new devs should not stress too much about missing the big picture, but that they should always be aware that it’s an important thing to learn. If you’re a new developer, take your time and work on as many large projects as you can. Be involved, ask questions, and ask for feedback. Seeing the big picture and writing readable, maintainable code is a skill that comes over time and it totally learnable.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What Is Important To Developers?</title>
      <link href="https://amberwilson.co.uk/blog/what-is-important-to-developers/"/>
      <updated>Wed, 24 Apr 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/what-is-important-to-developers/</id>
      <content type="html">&lt;p&gt;What is important to you as a developer? Over time I&#39;ve found that each developer has their own ideas of how to progress in their career, where they want to focus in the near future, and what being a good developer looks like. If you think about these things, what do you come up with?&lt;/p&gt;
&lt;p&gt;Personally, having come from a non-computer-science background, I’d very much like to gain some knowledge around backend langauges. This might include things like Java and NodeJS. To understand these languages better, I also need to improve my knowledge of client-side JavaScript so that I can better understand how the languages compare to each other. What will a comparison of different programming languages give me though?&lt;/p&gt;
&lt;p&gt;I think any sort of information—even a simple comparison–can open the gates to more easily understanding other important things in web development. For example, knowing how one programming language functions in comparison to another will allow me to understand how and why these language fit into a project ecosystem. A large project will be worked on by a team or teams that contain developers with very different levels of knowledge on different things. It pays to have at least a good, basic understanding of what everyone in your team does and why.&lt;/p&gt;
&lt;p&gt;Knowing what people in a team do and why can limit frustration - both on your side and theirs. This is because an understanding, even a basic one, of how parts of a project architecture fit together, and why they are there, will inform how you write your code. It will limit technical debt piling up from code that turns out to be irrelevant or not fit into a projects needs. Also, a healthy and maintainable project isn’t the only benefit - individuals benefit too.&lt;/p&gt;
&lt;p&gt;This benefit is developer experience. I find it so much more fun being a developer when I understand what is actually going on and why I am writing code. As a brand new developer, there were too many things to learn at once and as a result I felt overworked and underskilled. The result of this for me was imposter syndrome. Why was I there and how would I ever make valuable contributions? It took a long time for this feeling to fade and two years in, it is not completely gone. However, for the majority of the time I spend coding these days, I feel like I am on a good path and not stuck in a rut. There are still too many things for me to learn at once but I can now greet this as a healthy challenge rather than with a feeling of doom. A great thing about being a web developer is that there is so much to learn, and so many people to discuss with and support you in the web development community. For me this sparks a motivation to learn, share and be a better web developer.&lt;/p&gt;
&lt;p&gt;Being a better developer might be a universal goal that is shared by the majority of people who write code. I think finding the motivation to do this is the most important thing. Beyond this, you can do what you like to achieve it. Focus on a particular topic like security or accessibility, contribute to open source, write more documentation, review more PRs, create more PRs, speak at a conference, give a small presentation at work, read a book on a programming language you know nothing about, create a new personal project, whatever. Another important thing would be to share what you’ve learned and get feedback from others. Having a community to support what you’re trying to achieve is likely to get you there faster that working through things alone.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Can You Code A Design? - Part Two</title>
      <link href="https://amberwilson.co.uk/blog/can-you-code-a-design-part-two/"/>
      <updated>Sun, 13 Jan 2019 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/can-you-code-a-design-part-two/</id>
      <content type="html">&lt;p&gt;Last time I wrote about &lt;a href=&quot;https://amberwilson.co.uk/blog/can-you-code-a-design&quot;&gt;coding up a design&lt;/a&gt;, I was only two weeks into the related project. Now, it has been weeks since I finished and I am documenting the remainder of my scribbled-down points in the event that I or someone else might find them useful in the future. The below points are formatted exactly how I wrote them in the heat of varying degrees of exasperation - enjoy!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Check the most minimal thing you can do to get it out the door.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check with more than one person on specs!!! - one person may say you need something, another says you don’t etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heavily scrutinise the design for common design patterns and put these into your globals. Ask designers whether these are likely to change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PAIR PROGRAM WITH THE OTHER DEVELOPER FROM THE BEGINNING!!!!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure each dev respects coding, commenting and reviewing practices (this can be super hard).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t trust that you have the correct information. Communication between individuals in the project isn’t always perfect. Speak to each team member you work with. Ask them what they’re up to, share successes and information. You might (correction - probably will) find that they haven’t been given enough information by the PO and are stuck. You can then give them the required information, making everyone happier and less stressed. In short, over communicate rather than under communicate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get info you need before people go off on holidays.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Smile and be nice, it might make someone’s day or make their job easier or more pleasant. Be to others how you wish others to be to you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get automated testing in, don’t throw stuff at QA engineers and say “If the QA engineers say it’s fine, push it to production”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get some decisions for padding, fonts, colours and spacing in early people COME ON!!!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Can You Code A Design?</title>
      <link href="https://amberwilson.co.uk/blog/can-you-code-a-design/"/>
      <updated>Wed, 31 Oct 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/can-you-code-a-design/</id>
      <content type="html">&lt;p&gt;If you said &amp;quot;YES&amp;quot;, how exciting! Well done, you :-) &lt;em&gt;But wait&lt;/em&gt;... it&#39;s not always a bed of roses. If you&#39;ve already developed a real web page from a design, maybe you&#39;ll nod along to some of the points I have made below. The past two weeks, I’ve learned loads from building a static page using Gatsby (React) and SCSS (in this case CSS Modules, although I&#39;d have been partial to some Styled Components). React and SCSS get on pretty well from what I have seen. And static site generators like Gatsby help you set them up to work together. The configuration is the hardest part. Once you&#39;re past that, developing with these two is a breeze. &lt;em&gt;But wait&lt;/em&gt;... is it?&lt;/p&gt;
&lt;p&gt;In short, this post is all about &lt;strong&gt;things I’ve learned from building a page from a design (so far - I am only 2 weeks in - &lt;a href=&quot;https://amberwilson.co.uk/blog/can-you-code-a-design-part-two&quot;&gt;part two&lt;/a&gt; of this post will come once I wrap the project up)&lt;/strong&gt; ✏️ 💻&lt;/p&gt;
&lt;p&gt;So, &lt;strong&gt;here is my two-weeks worth of advice&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GET STANDARDS IN REALLY QUICKLY. By this, I mean that if you&#39;re a developer, sit down with the other developers working on the project, and the designers. If you are a designer, sit with the developers working on the project and the other designers. Once you&#39;re all sat down on nice seats, talk about all the good stuff like margins, paddings, deploy host, font-sizes, unit testing library, font-weights, colours, responsive behaviour, commit hooks, maximum-widths, content, naming things, linting, and where to all sit for lunch together to help strengthen your bond, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related to the above suggestion is COMMUNICATE WITH YOUR TEAM FROM THE BEGINNING. In fact, be each others&#39; new best friends. This will help get your project off to the best possible start. Like nurturing a newborn baby, input and support from each other will help reduce individual stress and help you all raise something really great. Chances are high that everyone on the team would really, really love to do a good job on the project. To achieve this, please don&#39;t hesitate to reach out and talk to each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back to point one for a minute. SET UP GLOBAL CSS STYLES and put them in a neat, tidy place. For the project I am working on, this meant getting stuck into a sass folder and setting up a few important files. For example - &lt;em&gt;constant&lt;/em&gt; values such as media query breakpoints, colours, font families/sizing and spacings, and &lt;em&gt;functions&lt;/em&gt; to plug these into and use with terrific &lt;em&gt;mixins&lt;/em&gt; that can be set free throughout your site to work their magic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AVOID TECHNICAL DEBT. After a couple of weeks developing a design that was ever-changing, myself and another developer built up a shiny mountain of it. For a few moments, I became certain that if the designers had simply given us a solid, unchanging design from the beginning, we&#39;d have done a better job. Then, I remembered that this isn&#39;t exactly the most agile idea. Waterfalls are old news. So, my developer friend and I decided that a great compromise would be to take design iteration #1 as our template and finish developing it. Then, the design would be free to change and mature, ready to be iterated on in round two of development. This way, tiny design changes would hold us back much less.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DAILY STANDUPS. Try to have these at a set time, or at least try to have impromptu meetings (as many as you want) with people you should be communicating design and development decisions to and with. Again, this is really important to the health of the project. If you&#39;re hesitant to communicate with other people in your team, the chances are that they are too and just wish you&#39;d approach them so they don&#39;t have to do do the scary thing and approach you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GET CODE REVIEWS FROM ALL DEVELOPERS, and I mean all developers company-wide, not only those assigned to the project. Why? This has several benefits. It helps you to increase your company&#39;s &lt;a href=&quot;https://medium.com/tech-tajawal/the-bus-factor-6ea1a3ede6bd&quot;&gt;bus factor&lt;/a&gt;, i.e. it gives a higher chance of someone being able to pick up development tasks on the project if all assigned developers are away for whatever reason. It increases individual developer competency. Also, developers who don&#39;t have their heads stuck in the project code all day every day tend to be better at spotting things and having ideas that the assigned developers did not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related to the above suggestion is DOCUMENT ALL YOUR THINGS. This means commenting any CSS that is not obvious at first glance, commenting JavaScript functions, keeping the project readme up-to-date, shiny and fabulous. Maybe then a developer who had never seen any of the code would be able to look at the code and feel comfortable and confident about contributing within a small amount of time. Confused developers tend to be stressed, too, and this doesn&#39;t benefit anyone or anything. Writing documentation takes time and slows down development tasks, but remember this - &lt;em&gt;you&lt;/em&gt; will actually ferociously thank &lt;em&gt;yourself&lt;/em&gt; a few weeks down the line when you look back at something &lt;em&gt;you&lt;/em&gt; wrote, while slowly tilting your head to the side while thinking how that code could &lt;em&gt;possibly&lt;/em&gt; have gotten there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can apply all, any or none of the above suggestions, plus any others that you find. All of them will require some effort, and definitely some extra time. How much effort is the outcome of your project, and the stress levels of those involved, worth? 😉&lt;/p&gt;
&lt;p&gt;See this post on Medium &lt;a href=&quot;https://medium.com/@ambrwlsn90/can-you-code-a-design-4d1e9f07795c&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>I am a 1-2 year developer</title>
      <link href="https://amberwilson.co.uk/blog/i-am-a-one-to-two-year-developer/"/>
      <updated>Mon, 15 Oct 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/i-am-a-one-to-two-year-developer/</id>
      <content type="html">&lt;p&gt;I recently read a blog post that grouped developers into categories depending on how long they have worked as one. I felt a little proud that I wasn&#39;t in the 0-1 year category, but in the 1-2 year one. This made me want to write about other things about my new career that I feel proud of.&lt;/p&gt;
&lt;p&gt;How do I feel now that I&#39;ve been a professional developer for more than a year? I certainly feel I have come a long way and accomplished things I never thought possible - especially when it comes to the current breadth and depth of my skills. A year ago, if you&#39;d asked me whether I&#39;d become so good at looking at a programming problem and confidently considering ways to work around it, become so good at finding answers, or intuitively avoid certain methods, I&#39;d have laughed.&lt;/p&gt;
&lt;p&gt;I like how being a developer surprises you. Over the last months, I’ve surprised myself with what I have been able to achieve. Most importantly (and intriguingly) for me, I’ve realised that while I still have a mountain of things to learn, whatever is left will always integrate with and enhance the knowledge I already have. This is intriguing because I didn’t have a strong sense of this at the beginning of my career. The skills and knowledge I have picked up remain with me and give me little “pick-me-ups” when I need them. This was something that was lacking before - when I had less of a strong foundation.&lt;/p&gt;
&lt;p&gt;My achievements are definitely the result of stepping outside my comfort zone and feeling uncomfortable with the tasks in front of me. I can certainly say that being challenged hasn’t always been easy. It’s made me feel a lot of low feelings. It’s also given me the wisdom that I’ll certainly experience low moments in the future, but that these will also afford me the opportunity to grow. Knowing this adds to my newly found confidence by helping me envision what to expect in the future.&lt;/p&gt;
&lt;p&gt;I recently began working, for the first time, with a developer who is more junior than me. I didn’t know that was going to happen, or even that I was going to work on the project I am on now. But I am really enjoying the experience. I immediately felt quite strongly about helping out and supporting this developer as much as I could. Over the past couple of weeks I think I’ve succeeded in doing that, and I think they feel the same way. I’m really excited about seeing what we will achieve together on the project and how our skills will grow.&lt;/p&gt;
&lt;p&gt;I have become more acutely aware of areas I would like to especially grow in. One of these is discussing technical topics with fellow developers. I want to take my opinions and feel smart enough to voice them, and I really want to have discussions with other developers that lead to productive outcomes. This skill is something I&#39;ve seen improvement in over time, but slower than I&#39;d have liked. Perhaps, as with my other work, I need to push myself out of my comfort zone and speak up more.&lt;/p&gt;
&lt;p&gt;In conclusion - sticking with the job even through hard times, especially through hard times, has made me a better developer than I ever expected, has made me more excited to continue and improve than I ever expected, and reminded me of the great Jessica Rose’s sentiment that feeling challenged is essential as it often means you are improving (without even knowing it).&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Playing with Pixels</title>
      <link href="https://amberwilson.co.uk/blog/playing-with-pixels/"/>
      <updated>Wed, 08 Aug 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/playing-with-pixels/</id>
      <content type="html">&lt;p&gt;I visited a great place with lots of graffiti at the weekend, and decided I&#39;d take one of my pictures from there and pixelise it - see the pixel version below and the original further down. Can&#39;t wait to practice more!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/playing-with-pixels/img/skull-icon.png&quot; alt=&quot;Skull pixel icon&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/playing-with-pixels/img/skull-graffiti.png&quot; alt=&quot;Skull graffiti&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Build Yourself Up</title>
      <link href="https://amberwilson.co.uk/blog/build-yourself-up/"/>
      <updated>Sat, 04 Aug 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/build-yourself-up/</id>
      <content type="html">&lt;p&gt;What I&#39;ve written here is meant for developers but I think it could work for anyone :)&lt;/p&gt;
&lt;p&gt;I feel like this post could be part of a series all about my experiences as a new developer that I&#39;ve written about over the past year. It&#39;s been great having the chance to experience becoming a developer and share my thoughts along the way.&lt;/p&gt;
&lt;p&gt;My idea for this post built up over a few months of working on a complex project at my new job. I was completely new to some of the technologies (React, Redux, GraphQL). At the start, I didn&#39;t use these, but rather took on smaller stories/tasks and tried to prepare for taking more complex ones.&lt;/p&gt;
&lt;p&gt;A few months in, the larger stories began to grow in number and I tentatively took some on. At first, nobody expected me to go too fast and I asked a lot of questions. Eventually, I began to complete stories faster and with less help. While it was challenging and fun, there were times when I got stuck, felt frustrated and guilty about the time I took. Other negative things I felt included wondering whether I&#39;d ever get better or ever learn how to do these things at all. In general, I was quite quick to put myself down when I didn&#39;t do something right the first time.&lt;/p&gt;
&lt;p&gt;It struck me this week that I often &lt;em&gt;put myself down&lt;/em&gt; for doing things wrong, but hardly ever &lt;em&gt;build myself up&lt;/em&gt; when I do things right. I wondered why people tend to do this, and was reminded of something I learned studying child psychology.&lt;/p&gt;
&lt;p&gt;Despite people having different ideas of what is right and wrong, it&#39;s usually clear whether something is one or the other. For children, this might be using a fork to eat their dinner vs. repeatedly chucking the fork as far as they can across the dining room. It somehow seems easier to react to the fork chucking rather than sitting and eating quietly. This means the child gets more attention for misbehaving than behaving well. In psychology, this is called giving positive reinforcement (attention) for &#39;wrong&#39; behaviour, and no reinforcement for &#39;right&#39; behaviour. This can lead to an escalation of negative behaviour and frustration for both the child and caregiver.&lt;/p&gt;
&lt;p&gt;I think a few developers may do this to themselves - i.e. pay a lot of attention to their perceived failures and not enough to their victories. I&#39;ve definitely done this a lot since becoming a developer. It might be because a lot more time and emotion is involved when something isn&#39;t going right. In contrast, when completing a task quickly and efficiently, it might seem less significant, and less energy might be put into celebrating. This is something I&#39;m going to try and change. I think everyone needs positivity and reassurance when they are doing things right. Just as much from themselves as everyone else.&lt;/p&gt;
&lt;p&gt;Being a developer can be really hard and feelings of frustration can be common. I&#39;d love to hear ideas on ways to pay less attention to the frustrating moments, and celebrate the positive ones more. If you have any ideas, let me know :)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Scotland CSS | Scotland JS</title>
      <link href="https://amberwilson.co.uk/blog/scotland-css-js/"/>
      <updated>Mon, 30 Jul 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/scotland-css-js/</id>
      <content type="html">&lt;p&gt;This post is split into three parts. Click and choose!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#diary&quot;&gt;Diary&lt;/a&gt; of my time in Scotland&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#tips&quot;&gt;Tips&lt;/a&gt; from speakers used in this blog post&lt;/li&gt;
&lt;li&gt;✨ &lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#isspecial&quot;&gt;Why this conference is special&lt;/a&gt; ✨&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I will post a link to the official photos once they are out! (hint: they are good).&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.katiefenn.co.uk/&quot;&gt;Katie Fenn&lt;/a&gt;&#39;s terrific and poignant &lt;a href=&quot;https://www.katiefenn.co.uk/scotland-js-retrospective/&quot;&gt;article on the conferences&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&quot;diary&quot; class=&quot;heading-with-siblings&quot;&gt;
  &lt;h2&gt;Diary&amp;nbsp;&lt;a class=&quot;single-link-light&quot; href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#diary&quot;&gt; # &lt;/a&gt;&amp;nbsp;&lt;/h2&gt;
  &lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#&quot; role=&quot;link&quot;&gt;
    &lt;svg width=&quot;28&quot; height=&quot;14&quot; viewBox=&quot;0 0 53 25&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; aria-labelledby=&quot;title1 desc1&quot; class=&quot;back-to-top-svg&quot;&gt;
    &lt;title id=&quot;title1&quot;&gt;Back to the top arrow&lt;/title&gt;
    &lt;desc id=&quot;desc1&quot;&gt;Click this to go back to the top of the blog post&lt;/desc&gt;
    &lt;path stroke=&quot;currentcolor&quot; stroke-width=&quot;6&quot; d=&quot;M2 22.5L27.46 2 51 22.5&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;At 12.58pm on 17th July I stepped off the train into Edinburgh station. It was sunny! I noticed the architecture immediately - very beautiful and old. It wasn&#39;t long before I got to meet up with a very good web friend of mine, Flaki. We found the longest staircase we could and took our suitcases up it on our way to our accommodation. Once there we met up with two more good friends, Pilar and Ramón. After this, I met up with an old friend for dinner at The Castle Arms, before we all made our way to a Ceilidh dance &lt;a href=&quot;https://twitter.com/jiggy_pete&quot;&gt;Peter&lt;/a&gt; invited us to. This was a &lt;em&gt;blast&lt;/em&gt; and a perfect way to begin the great things to come!&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/castlearms.jpg&quot; alt=&quot;Castle Arms pub in Edinburgh&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;The Castle Arms pub (photo / Me)&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/ceilidh.jpg&quot; alt=&quot;Ceilidh dance before Scotland CSS and JS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;Ceilidh (photo / Me)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;At 7.15am, I walked to the conference venue, Dynamic Earth, and met up with the rest of the volunteers. I&#39;d already met some during our code of conduct and speaker buddy training a few days previously. We got our t-shirts on and got to it. Soon the first attendees were arriving and the talks began. Peter did a great job of answering any questions we had and making us all feel very comfortable and welcome. I was so happy to hang out with my friends. I even got to see Emily and Anwen from codebar Brighton again! &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; is the amazing free initiative that helped me become a developer &amp;lt;3 &amp;lt;3&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/fredbaelameflaki.jpg&quot; alt=&quot;Fred, Baela, me and Flaki at Scotland CSS&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;Fred, Bæla, me, Flaki (photo / Frederic Marx)&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/emilymeanwen.jpg&quot; alt=&quot;Emily, me and Anwen at Scotland CSS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;Emily, me, Anwen - codebar Brighton reunion! (photo / Anwen Williams)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The quality of the talks at Scotland CSS were, in Peter&#39;s words, &lt;em&gt;beyond phenomenal&lt;/em&gt;. The quality and variation in the topics was amazing. Each talk was 20 minutes, and in a set of three. After each set there was a separate discussion slot for each speaker, which the audience could attend to ask questions. &lt;strong&gt;This was a really nice and down-to-earth format that broke down barriers between audience and speakers and allowed everyone to feel on the same level! The stage for speakers was also very low - at the level of the audience. No hero-worship of speakers here.&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/discussion.jpg&quot; alt=&quot;Outdoor chat with Meara Charnetzki, ScotlandJS&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;Chat with Meara Charnetzki (photo / &lt;a href=&quot;https://www.scottlogic.com/&quot;&gt;Scott Logic&lt;/a&gt;)
&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/lowstage.jpg&quot; alt=&quot;Trishul Goel speaking at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;Trishul Goel on the low stage (photo / Flaki )&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;After Scotland CSS, some of us headed to dinner at Holyrood 9A (amazing burgers) where Emily and I had vegan haggis burgers! After this we made our way to Hemma where we had drinks with other conference goers. They had some of my favourite beer. By now, everyone was tired but we were all having such a nice time, it was really hard to drag ourselves away and go home!&lt;/p&gt;
&lt;p&gt;At 7.45am I arrived for the second day of conferencing and the beginning of Scotland JS! This day was just as amazing as the one before. The volunteers all helped each other to see our desired talks, speak with friends and feel relaxed and happy. I am so super grateful to every single fellow volunteer there. Anwen and I met Evelyn from codebar Edinburgh. Evelyn not only volunteered but also MCed at Scotland JS! From left-to-right, we represented codebar Berlin, Edinburgh and Brighton! Nicki and I were lucky enough to be approached by avid-coder Connie (the youngest attendee at 10 years old) and her mum who asked us if we wanted to Floss! For anyone not cool enough to know, flossing overtook dabbing as the in-thing. Find the video below, featuring our very own Peter, if you are still confused.&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/codebartimesthree.jpg&quot; alt=&quot;Me, Evelyn and Anwen at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;Me, Evelyn, Anwen - codebar * 3! (photo / Anwen)&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/floss.jpg&quot; alt=&quot;Nicki, Connie and me flossing at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;Nicki, Connie &amp; me flossing (photo / Connie)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The first night of Scotland JS, we were lucky to be treated to gin and whisky tasting where we sat with friends and sampled some of Scotland&#39;s finest spirits. I also had a fantastic vegan haggis baked potato (never thought I&#39;d put those words next to each other in a sentence) with two fantastic humans. Some people went to karaoke but I was way too tired so I went to bed. Not before being shown where the deep fried mars bars were sold, though.&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/potatoes.jpg&quot; alt=&quot;Me, Evelyn and Anwen at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;Potato posers - me, Peter, Fred (photo / Me)&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/ginandwhisky.jpg&quot; alt=&quot;Gin and Whisky tasking at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;2 gins, 3 whiskies (photo / Me)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The last day of the conference began a little later at 9am. It was just as good as the previous two days, and I already began to feel a little sad that the conferences were nearly over. As the last speaker was wrapping up, everyone thought that was it. But, Peter had a surprise for us. Read about it at the end of this post ;-)&lt;/p&gt;
&lt;p&gt;The last night of the conferences was spent again at Hemma, amongst friends. And amonst fish and chips because Edinburgh restaurants are &lt;em&gt;really&lt;/em&gt; busy on Friday nights! I was very glad that I was staying in Scotland for one more day so I could walk around beautiful Edinburgh. I miss it and my web friends already - until next time :-)&lt;/p&gt;
&lt;div id=&quot;tips&quot; class=&quot;heading-with-siblings&quot;&gt;
  &lt;h2&gt;Tips&amp;nbsp;&lt;a class=&quot;single-link-light&quot; href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#tips&quot;&gt; # &lt;/a&gt;&amp;nbsp;&lt;/h2&gt;
&lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#&quot; role=&quot;link&quot;&gt;
    &lt;svg width=&quot;28&quot; height=&quot;14&quot; viewBox=&quot;0 0 53 25&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; aria-labelledby=&quot;title2 desc2&quot; class=&quot;back-to-top-svg&quot;&gt;
    &lt;title id=&quot;title2&quot;&gt;Back to the top arrow&lt;/title&gt;
    &lt;desc id=&quot;desc2&quot;&gt;Click this to go back to the top of the blog post&lt;/desc&gt;
    &lt;path stroke=&quot;currentcolor&quot; stroke-width=&quot;6&quot; d=&quot;M2 22.5L27.46 2 51 22.5&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;I used tips from speakers in this blog post, because the material was just &lt;em&gt;so&lt;/em&gt; good! I wasn&#39;t able to see every speaker, but I&#39;ll watch all the videos once they are out :-) All tips are from Scotland CSS, as I&#39;m not using any JavaScript on my site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mntr.dk/&quot;&gt;Peter Müller&lt;/a&gt;&#39;s &amp;quot;&lt;a href=&quot;http://slides.com/munter/high-performance-web-fonts-scotlandcss#/&quot;&gt;High Performance Web Fonts&lt;/a&gt;&amp;quot; was about improving performance using local fonts rather than Google fonts, font subsetting, and his node package &lt;a href=&quot;https://www.npmjs.com/package/subfont&quot;&gt;subfont&lt;/a&gt;. He added network tab visuals to help us understand the performance benefits. I went ahead and downloaded the two Google fonts I usually access with two separates HTTP requests, and added the local versions to my site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/szynszyliszys&quot;&gt;Anna Migas&lt;/a&gt;&#39;s &amp;quot;&lt;a href=&quot;https://www.slideshare.net/AnnaMigas1/fast-but-not-furious-debugging-user-interaction-performance-issues&quot;&gt;Fast But Not Furious: Debugging User Interface Issues&lt;/a&gt;&amp;quot; taught me the order pages load in. An event is fired (JavaScript), styles are calculated, layout is calculated, things are rasterised and painted into layers, layers are composited together. Check out a site&#39;s layers by going to the &lt;em&gt;layers&lt;/em&gt; tab in chrome dev tools! I figured out my site only has one layer as it is static and has no JavaScript.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.artist-developer.com/&quot;&gt;Natalya&lt;/a&gt;&#39;s &amp;quot;&lt;a href=&quot;https://docs.google.com/presentation/d/1dERF3H9jQ3Yb7pIIx7hzWJKxvFjyvFNvFUq-mzcx27E/edit#slide=id.g34872239f6_0_6&quot;&gt;Bootstrap to CSS Grid&lt;/a&gt;&amp;quot; encourages companies to adopt CSS Grid and explains the benefits of doing so. Grid can be gradually adopted into an existing codebase. I demonstrated this here by using it to position my images and figure captions. I used &lt;code&gt;grid-template-columns&lt;/code&gt; , &lt;code&gt;grid-template-areas&lt;/code&gt; , and &lt;code&gt;grid-area&lt;/code&gt; to position things exactly as I want them. The mobile version of this page uses Flexbox instead. Yep, you can mix Grid and Flexbox! Check out Firefox dev tools for a great visual representation of my picture grid.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/Sareh88&quot;&gt;Sareh Heidari&lt;/a&gt;&#39;s &amp;quot;Quick Tips for Performant Websites&amp;quot; encouraged us to think what our users&#39; priorities are. Sareh taught us about some resource hints to give browsers a helping hand loading things. I had not heard of these before. See an artice on &lt;a href=&quot;https://css-tricks.com/prefetching-preloading-prebrowsing/&quot;&gt;how resource pre-fetching helps performance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jessica.tech/&quot;&gt;Jessics Rose&#39;s&lt;/a&gt; talk on &lt;a href=&quot;https://www.youtube.com/watch?v=nbg2Is6VOCM&quot;&gt;Impostor Syndrome and Individual Competence&lt;/a&gt; taught me something completely new. Not something technical that I can add to this post, but something really important. About how feeling yourself struggle means growth. You have stuff that&#39;s too easy and stuff that&#39;s too hard and right in the middle of the venn diagram (the &lt;em&gt;zone of proximal development&lt;/em&gt;) is where you should be, in order to grow. Challenging and pushing your mind. It can feel uncomfortable - this is where imposter syndrome can often kick in. But in these cases, it helps tremendously to give yourself a gentle reminder that you are absolutely fine. Of course while remembering to give yourself sufficient periods of rest to recover from the sustained effort of learning.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/matchboxhero10&quot;&gt;Steven Robert&lt;/a&gt;&#39;s &amp;quot;CSS Animation - Best of the Web&amp;quot; was my favourite talk. I really couldn&#39;t wait to have a go at creating my own animation using code. He showed us how to use SVGs in separate cells (frames) with keyframes and animation properties to create just about any animation we&#39;d want. Here is a &lt;a href=&quot;https://codepen.io/collection/nkBVzK/&quot;&gt;link to Steven&#39;s codepen&lt;/a&gt;, and a &lt;a href=&quot;https://codepen.io/matchboxhero/pen/RLebOY&quot;&gt;link to his bird animation&lt;/a&gt; that inspired his talk and the below rabbity animation. Scroll to &lt;a href=&quot;https://www.creativebloq.com/inspiration/css-animation-examples&quot;&gt;number 4 in this list for the tutorial&lt;/a&gt;. Steven helped me out when I had questions and I&#39;m really grateful for that :-) Through making the &lt;a href=&quot;https://codepen.io/ambrwlsn90/pen/ajVReX&quot;&gt;rabbity animation&lt;/a&gt;), I learned more about SVGs and how the viewBox attribute works.&lt;/li&gt;
&lt;/ul&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/rabbit-cells.svg&quot; alt=&quot;&quot; /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div id=&quot;isspecial&quot; class=&quot;heading-with-siblings&quot;&gt;
&lt;h2&gt;Why This Conference is Special&amp;nbsp;&lt;a class=&quot;single-link-light&quot; href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#isspecial&quot;&gt; # &lt;/a&gt;&amp;nbsp;&lt;/h2&gt;
  &lt;a href=&quot;https://amberwilson.co.uk/blog/scotland-css-js/#&quot; role=&quot;link&quot;&gt;
    &lt;svg width=&quot;28&quot; height=&quot;14&quot; viewBox=&quot;0 0 53 25&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; aria-labelledby=&quot;title3 desc3&quot; class=&quot;back-to-top-svg&quot;&gt;
    &lt;title id=&quot;title3&quot;&gt;Back to the top arrow&lt;/title&gt;
    &lt;desc id=&quot;desc3&quot;&gt;Click this to go back to the top of the blog post&lt;/desc&gt;
    &lt;path stroke=&quot;currentcolor&quot; stroke-width=&quot;6&quot; d=&quot;M2 22.5L27.46 2 51 22.5&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;I believe the technology community and related events can learn a lot from Scotland CSS and Scotland JS.&lt;/p&gt;
&lt;p&gt;I think Frederic did a good job explaining why.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Resting up after an intense week of &lt;a href=&quot;https://twitter.com/ScotlandCSS?ref_src=twsrc%5Etfw&quot;&gt;@ScotlandCSS&lt;/a&gt;                                    and &lt;a href=&quot;https://twitter.com/ScotlandJS?ref_src=twsrc%5Etfw&quot;&gt;@ScotlandJS&lt;/a&gt;.&lt;br /&gt;☕️🛋🎶&lt;br /&gt;&lt;br /&gt;Thanks
      so much to &lt;a href=&quot;https://twitter.com/jiggy_pete?ref_src=twsrc%5Etfw&quot;&gt;@jiggy_pete&lt;/a&gt;                                    &amp;amp; team for fostering a community that’s equally inclusive and transformative for
      long-time industry experts, as well as total beginners, and everyone in between.&lt;/p&gt;&amp;mdash;
  Frederic Marx (@fredericmarx) &lt;a href=&quot;https://twitter.com/fredericmarx/status/1021026409903423490?ref_src=twsrc%5Etfw&quot;&gt;July 22, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scotland CSS and JS is created and curated by &lt;a href=&quot;https://twitter.com/jiggy_pete&quot;&gt;Peter Aitken&lt;/a&gt;. The community Peter works so hard to build (not only at these conferences) is &lt;em&gt;inclusive&lt;/em&gt; and &lt;em&gt;transformative&lt;/em&gt; for &lt;em&gt;everyone&lt;/em&gt;, no matter what their level. At some conferences, I have felt left out in favour of developers who are much more established. I didn&#39;t feel like that for a second at Peter&#39;s conferences. On the contrary, I felt safe, welcome, and included.&lt;/p&gt;
&lt;p&gt;I am thrilled that so many others seemed to have a similar experience.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/ScotlandJS?ref_src=twsrc%5Etfw&quot;&gt;@ScotlandJS&lt;/a&gt; is the first Tech
      conference in 10 years in Europe, where I felt that people like myself, and &lt;a href=&quot;https://twitter.com/CodeYourFuture_?ref_src=twsrc%5Etfw&quot;&gt;@CodeYourFuture_&lt;/a&gt;                                students, are first-class citizens. Thank you &lt;a href=&quot;https://twitter.com/jiggy_pete?ref_src=twsrc%5Etfw&quot;&gt;@jiggy_pete&lt;/a&gt;                                for making a Tech event that is genuinely and sincerely welcoming and inclusive to *others*
      1/3
  &lt;/p&gt;&amp;mdash; Mozafar (@kabaros) &lt;a href=&quot;https://twitter.com/kabaros/status/1021516957810675723?ref_src=twsrc%5Etfw&quot;&gt;July 23, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;On the first day of the conferences, at Scotland CSS, the first thing we all saw was one of the code of conduct banners. The other banner (not shown here) had the short AND long version of the code of conduct written on it. We were also introduced to our lovely code of conduct team - Evelyn, Katie, Nicki and Peter. I&#39;ve never seen or experienced the code of conduct being enforced in such a diligent or more organised way. It made me feel very safe and I hope it did the same for others.&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/cocbanner.jpg&quot; alt=&quot;Code of Conduct banner&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;Code of Conduct banner (photo / &lt;a href=&quot;https://www.juliebee.co.uk/&quot;&gt;Julie Broadfoot&lt;/a&gt;)&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/cocteam.jpg&quot; alt=&quot;Code of Conduct team at Scotland CSS&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;Code of Conduct team (photo / &lt;a href=&quot;https://www.juliebee.co.uk/&quot;&gt;Julie Broadfoot&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The youngest attendee, Connie, was 10 years old. Peter introduced her to us and all the great work she&#39;s already done. I was lucky to get to speak (and dance!) with her. I heard about the adventures she&#39;s been on with coding so far, saw some of her work and chatted with her about Harry Potter. She is a Gryffindor.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;So pleased to welcome our youngest attendee to &lt;a href=&quot;https://twitter.com/hashtag/scotlandjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#scotlandjs&lt;/a&gt;                                &lt;br /&gt;&lt;br /&gt;We’re glad you had an amazing time and can’t wait to find out what you create in
      the future 💛
      &lt;a href=&quot;https://t.co/HlX3xPT106&quot;&gt;https://t.co/HlX3xPT106&lt;/a&gt;
  &lt;/p&gt;&amp;mdash; Scotland JS (@ScotlandJS) &lt;a href=&quot;https://twitter.com/ScotlandJS/status/1020631634524196864?ref_src=twsrc%5Etfw&quot;&gt;July 21, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;Connie was also &lt;a href=&quot;http://weareupfront.com/&quot;&gt;Upfront&lt;/a&gt;. Other people were too, including my good friend Anwen. I first learned about being Upfront last year at UX London where I met the great Lauren Currie. She is from Scotland and has done &lt;a href=&quot;http://www.redjotter.com/&quot;&gt;a tonne of amazing work&lt;/a&gt;. She wanted a way for people to get experience being on stage without having to speak. What happens is a few chairs are set up on one side of the stage, and aspiring speakers sit down while a speaker gives their talk. Lauren hopes these people gain enough confidence to speak one day. I am on the Upfront &lt;a href=&quot;http://weareupfront.com/blog/&quot;&gt;blog&lt;/a&gt; :-)&lt;/p&gt;
&lt;p&gt;As I mentioned in the first section of this post, there was a low stage, and also face-to-face speaker discussion - both of which broke down barriers between speakers and attendees. There has been talk around &#39;hero-worship&#39; of speakers at some conferences. This certainly was not the case here, and I&#39;m sure many people had a much more genuine experience because of it.&lt;/p&gt;
&lt;p&gt;Some things weren&#39;t as obvious as inclusive measures at first glance, but they were there. For example, Peter convinced the venue to add gender-neutral toilets. He took the advice of &lt;a href=&quot;http://tarnoff.info/&quot;&gt;Nat Tarnoff&lt;/a&gt; on adding animation warnings for those with vestibular disorders, and also added warnings about flashing lights and loud videos. There was plenty of vegan and vegetarian food and snacks. Based on past feedback, Peter set a board game evening up to run alongside gin and whisky tasting for those who didn&#39;t want to drink.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Scotland CSS &amp;amp; Scotland JS was certainly a team effort: organizers, volunteers, speakers,
      even attendees (who, as ticketholders, got to vote &amp;amp; decide on the final lineup) — worked
      together tirelessly to make it happen…&lt;br /&gt;&lt;br /&gt;BUT.&lt;br /&gt;&lt;br /&gt;I need to leave this here:
      &lt;a href=&quot;https://t.co/M4ToVpPou7&quot;&gt;https://t.co/M4ToVpPou7&lt;/a&gt;&lt;/p&gt;&amp;mdash; 𝔣𝔩𝔞𝔨𝔦 (@slsoftworks)
  &lt;a href=&quot;https://twitter.com/slsoftworks/status/1021434833292222465?ref_src=twsrc%5Etfw&quot;&gt;July 23, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;This conference feels different to any I&#39;ve been to before, and by now I have been to quite a few. This feeling began even before the conference began, with a video call from Peter. He took time to have a face-to-face conversation with me to tell me all about what volunteering would involve. After I&#39;d agreed to volunteer (not a hard decision at all), Peter arranged for &lt;a href=&quot;http://www.katiefenn.co.uk/&quot;&gt;Katie&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/mr_urf&quot;&gt;Alan&lt;/a&gt; to have a video call with all volunteers. On this call, we were able to learn more about the code of conduct and how to help out speakers on the day. At all times before, during and after the conference, Peter would reply to questions quickly and enthusiastically.&lt;/p&gt;
&lt;p&gt;This is the first conference, event, meetup, anything that I have been to that made me really, truly feel that change is really possible. By this I mean change in people&#39;s attitudes to diversity in tech, and diversity everywhere else too. As a white person in tech, I have plenty of privilege. As a woman in tech, I&#39;ve also felt an undercurrent of discrimination. I hope these two postions / viewpoints help me to be more aware and empathetic towards the experiences of everyone. I am definitely aware that there are people in tech, and everywhere, that are not comfortable feeling uncomfortable. By this I mean certain people are much more likely to sweep certain people&#39;s experiences under-the-rug than do something to help.&lt;/p&gt;
&lt;p&gt;Peter surpised us with an unexpected speaker at the end of Scotland JS. &lt;a href=&quot;https://hashtagcauseascene.com/about-kim/&quot;&gt;Kim Crayton&lt;/a&gt; spoke to us about privilege, diversity, and how we need to get comfortable with being uncomfortable. So that we can change where tech is heading today, allow everyones voices to be heard (not only a select, privileged few), and work towards a world where every single person feels safe in their own skin. I had a second surprise, and it seems nobody else saw it coming either, but this was to be the last Scotland CSS and Scotland JS. Peter, speaking slowly and purposefully, told us that his focus going forward must be on &lt;a href=&quot;https://www.globaldiversitycfpday.com/&quot;&gt;Global CFP Day&lt;/a&gt;, a worldwide event that helps people begin speaking and sharing their knowledge and experiences. See a photo below of the Berlin version that I was lucky enough to mentor at back in February - one of over &lt;em&gt;50&lt;/em&gt; events worldwide.&lt;/p&gt;
&lt;figure class=&quot;image-grid-two-images captions-two-images&quot;&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/kimcrayton.jpg&quot; alt=&quot;Kim Crayton speaking at Scotland JS&quot; /&gt;
&lt;figcaption class=&quot;item2&quot;&gt;
&lt;a href=&quot;https://hashtagcauseascene.com/about-kim/&quot;&gt;Kim Crayton&lt;/a&gt; (photo / Flaki)
&lt;/figcaption&gt;
&lt;img loading=&quot;lazy&quot; src=&quot;https://amberwilson.co.uk/blog/scotland-css-js/img/cfpday.jpg&quot; alt=&quot;Global CFP Day Berlin edition&quot; /&gt;
&lt;figcaption class=&quot;item4&quot;&gt;
CFP day in Berlin (photo / &lt;a href=&quot;https://twitter.com/priyankanaik625&quot;&gt;Priyanka Naik&lt;/a&gt;)
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A third surprise awaited us. Peter got onto the stage once more to announce that with the rest of the conference money, he was going to donate 10 computers to &lt;a href=&quot;https://codeyourfuture.io/&quot;&gt;Code Your Future&lt;/a&gt; - a UK-based coding school for refugees who want to become web developers.&lt;/p&gt;
&lt;p&gt;It was hard to fight back the tears when Peter&#39;s family came on stage to hug him and his wife said she is really proud of him. It must be safe to say that we are all endlessly proud of Peter, and the genuine enthusiasm, kindness and tireless hard work he puts into what he does.&lt;em&gt;Thank you&lt;/em&gt;, Peter Aitken!&lt;/p&gt;
&lt;blockquote&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The Floss &lt;a href=&quot;https://twitter.com/ScotlandJS?ref_src=twsrc%5Etfw&quot;&gt;@scotlandjs&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/scotlandjs2018?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#scotlandjs2018&lt;/a&gt; edition &lt;a href=&quot;https://twitter.com/hashtag/Floss?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Floss&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/flossing?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#flossing&lt;/a&gt; &lt;a href=&quot;https://twitter.com/jiggy_pete?ref_src=twsrc%5Etfw&quot;&gt;@jiggy_pete&lt;/a&gt; &lt;a href=&quot;https://twitter.com/waffles193?ref_src=twsrc%5Etfw&quot;&gt;@waffles193&lt;/a&gt; &lt;a href=&quot;https://twitter.com/herecomesjaycee?ref_src=twsrc%5Etfw&quot;&gt;@herecomesjaycee&lt;/a&gt; &lt;a href=&quot;https://t.co/KFvyl7QNOq&quot;&gt;pic.twitter.com/KFvyl7QNOq&lt;/a&gt;&lt;/p&gt;&amp;mdash; Amber Wilson (@ambrwlsn90) &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/1019969967586934784?ref_src=twsrc%5Etfw&quot;&gt;July 19, 2018&lt;/a&gt;&lt;/blockquote&gt;
</content>
    </entry>
    
    <entry>
      <title>JSConf EU: Community Lounge</title>
      <link href="https://amberwilson.co.uk/blog/jsconfeu-community-lounge/"/>
      <updated>Thu, 07 Jun 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/jsconfeu-community-lounge/</id>
      <content type="html">&lt;p&gt;One month ago, I was invited by &lt;a href=&quot;https://twitter.com/vanessayuenn&quot;&gt;Vanessa&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/sheley&quot;&gt;Michele&lt;/a&gt; to speak at the JSConf EU community lounge in sunny Berlin. This was a tremendous honour - not only would I be able to talk about how great &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; is to a crowd of eager attendees, but I&#39;d be able to participate in both &lt;a href=&quot;https://2018.cssconf.eu/&quot;&gt;CSS&lt;/a&gt; and &lt;a href=&quot;https://2018.jsconf.eu/&quot;&gt;JSConf EU&lt;/a&gt;, and catch up with lots of old and new friends.&lt;/p&gt;
&lt;p&gt;Something I couldn&#39;t help noticing as soon as I arrived, was the fantastic effort the conference organisers put into designing a great space for everyone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/jsconfeu-community-lounge/img/arena-berlin.jpg&quot; alt=&quot;Arena Berlin during CSS and JSConf EU&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One of the best corners of this space was definitely the community lounge!&lt;/p&gt;
&lt;p&gt;On arrival, I found the lounge prepped and pillowed-up, the sticker table and job board ready to be filled, and plenty of space available for people to watch lightning talks from local tech initiatives. The thing I was most excited about, though, was to see the codebar poster sitting proudly right at the entrance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/jsconfeu-community-lounge/img/codebar-and-me.jpg&quot; alt=&quot;Amber holding the codebar poster&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Across three days, there were so many great speakers who shared their local initiatives - ones that had made such a difference in their own lives. Among them were several Berlin meet ups I had long admired and attended. Wanting to give codebar every ounce of credit it deserves, I created the best presentation I could. I wanted to talk about how codebar works, and let people know how to get involved in &lt;a href=&quot;https://codebar.io/berlin&quot;&gt;codebar Berlin&lt;/a&gt;. I also wanted to get across to the audience how much codebar means to me personally.&lt;/p&gt;
&lt;p&gt;It was mid-2016 when I attended my first codebar in &lt;a href=&quot;https://codebar.io/brighton&quot;&gt;Brighton&lt;/a&gt;, UK - and without exaggerating, I can confidently say that it amazed me beyond words. I remember thinking &amp;quot;how can it possibly be that I&#39;m here, being introduced to codebar by fantastic organisers, inside a lovely venue, with free food?&amp;quot; Not only that - how was it that I got to sit with a super nice coach for TWO hours to refresh my rusty HTML and CSS? Since being supported through codebar to achieve my first internship in tech, and becoming a coach and organiser myself around a year ago, multiple students have approached me with exactly the same questions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/jsconfeu-community-lounge/img/codebar-lightning-talk.jpg&quot; alt=&quot;Amber speaking about codebar&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One of the best things about the whole experience of the community lounge for me was hearing from people who feel equally as strongly about the initiatives they are part of, and who have achieved similarly wonderful things - all through the tireless efforts of volunteers who make such things possible.&lt;/p&gt;
&lt;p&gt;Here is the list of everyone who did a lightning talk ⚡ -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClojureBridge / Dani&lt;/li&gt;
&lt;li&gt;PyLadies / Jessica&lt;/li&gt;
&lt;li&gt;Summer of Code / Laura&lt;/li&gt;
&lt;li&gt;Spektrum / Wolf&lt;/li&gt;
&lt;li&gt;BerlinJS / Robin&lt;/li&gt;
&lt;li&gt;It’s a Volunteer’s World / Dajana&lt;/li&gt;
&lt;li&gt;Alva / Julian, Markus, Tilman&lt;/li&gt;
&lt;li&gt;Women Tech Makers Berlin / Corina&lt;/li&gt;
&lt;li&gt;OMGDPR / Chris&lt;/li&gt;
&lt;li&gt;NodeSchool Berlin / Finn&lt;/li&gt;
&lt;li&gt;Choose Your Own Instrument / Tiffany&lt;/li&gt;
&lt;li&gt;Simply Secure / Eileen&lt;/li&gt;
&lt;li&gt;Common Voice / Mike&lt;/li&gt;
&lt;li&gt;CSSClasses / Katrin&lt;/li&gt;
&lt;li&gt;AfroTechFest / Debs&lt;/li&gt;
&lt;li&gt;codebar Berlin / Amber&lt;/li&gt;
&lt;li&gt;UpFront / Katharina&lt;/li&gt;
&lt;li&gt;Rails Girls (Code Curious) / Ferdous&lt;/li&gt;
&lt;li&gt;ReDi School / Inana &amp;amp; Obay&lt;/li&gt;
&lt;li&gt;Open Tech School / Mohamed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the tweet below that links to each and every initiative and the people who spoke about them!&lt;/p&gt;
&lt;blockquote&gt;
    &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;🤩🌈 The Community Lounge is welcoming 20 unique presentations across all three conference days at
        &lt;a href=&quot;https://twitter.com/CSSconfeu?ref_src=twsrc%5Etfw&quot;&gt;@CSSconfeu&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jsconfeu?ref_src=twsrc%5Etfw&quot;&gt;@jsconfeu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We&amp;#39;re
        so thrilled to have an amazing program that showcases people who are doing remarkable and noteworthy
        work in the community ⚡️&lt;/p&gt;&amp;mdash; JSConf EU (@jsconfeu) &lt;a href=&quot;https://twitter.com/jsconfeu/status/1002246925226307584?ref_src=twsrc%5Etfw&quot;&gt;May 31, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;I want to sincerely thank the organisers of CSSConf EU and JSConf EU for being so kind to invite codebar, and all of the other great initiatives that provide safe spaces for people to learn. I want to give a special shout out to &lt;a href=&quot;https://twitter.com/janl&quot;&gt;Jan&lt;/a&gt; who was an amazing host. It was an incredible opportunity to spread information about the great things codebar makes possible. I am really, really excited to report that on the Monday after the conferences, we had the &lt;a href=&quot;https://twitter.com/codebarBerlin/status/1003900234613907456&quot;&gt;busiest Berlin codebar&lt;/a&gt; on record - and I can&#39;t wait to see what else we can do to help even more students learn and discover possibilities for themselves in tech.&lt;/p&gt;
&lt;p&gt;If you&#39;d like to get more involved in codebar - we are always looking for more students, &lt;a href=&quot;https://codebar.io/coaches&quot;&gt;coaches&lt;/a&gt; and &lt;a href=&quot;https://codebar.io/sponsors&quot;&gt;sponsors&lt;/a&gt;! - please see (and sign up on) our &lt;a href=&quot;https://codebar.io/&quot;&gt;website&lt;/a&gt;, check out our main &lt;a href=&quot;https://twitter.com/codebar&quot;&gt;Twitter&lt;/a&gt; (each chapter around the world has their own Twitter account), email us at &lt;a href=&quot;mailto:hello@codebar.io&quot;&gt;hello@codebar.io&lt;/a&gt;, see our main &lt;a href=&quot;https://www.facebook.com/codebarHQ/?ref=br_rs&quot;&gt;Facebook&lt;/a&gt; and &lt;a href=&quot;https://www.instagram.com/codebarhq/&quot;&gt;Instagram&lt;/a&gt; accounts, and find our &lt;a href=&quot;https://codebar-slack.herokuapp.com/&quot;&gt;Slack&lt;/a&gt; channels! ❤️&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Pair Programming</title>
      <link href="https://amberwilson.co.uk/blog/pair-programming/"/>
      <updated>Sun, 06 May 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/pair-programming/</id>
      <content type="html">&lt;p&gt;Firstly, what is pair programming? It’s two developers sitting together, usually at one computer, where one types code and the other checks the code. In essence, it involves two developers who are thinking about different aspects of the same programming feature, and are constantly communicating in order to keep their understanding in sync. Some of you may know this already. Apart from this very short introduction, I can really only tell you about my own personal experiences with it. But first I’ll tell you a little bit about me.&lt;/p&gt;
&lt;p&gt;I am a front end developer currently working at Edenspiekermann in Berlin, where I code alongside many talented and friendly developers and designers. It’s my second ever job as a developer, and in total, I’ve been working as a developer for less than a year. Other facts about me include that I’ve lived and worked in six countries (including the Netherlands where I got a masters in Psychology), I really love writing, I really really love my developer community and my favourite text editor is VS Code.&lt;/p&gt;
&lt;p&gt;My current career in tech is exciting, full of opportunities and it’s fast-paced. My past career in psychology involved learning how to understand and help people. The mix of these two careers has led me to take an interest in the more human side of web development, and how we can all feel better about the jobs we do. I believe that the better we feel about what we do, the better the results of our work will be for everyone. The reason I want to write about pair programming is entirely selfish. It’s something that makes me feel much, much better about the job I do and I want to share with you the reasons why.&lt;/p&gt;
&lt;p&gt;I don’t want to give you a list of pros and cons. I think comparing the pros and cons is a bit impersonal, which makes it difficult to connect any of the benefits with your own experiences. Instead, I’ll be telling stories about my own and others’ experiences. I hope that these can click and resonate with you.&lt;/p&gt;
&lt;p&gt;To me it seems some of the hardest things for a new developer, and also any developer who is just beginning at a new company are getting used to the company culture, learning how members of the team do their best work, and getting acquainted with the codebase.&lt;/p&gt;
&lt;p&gt;At work, we have dev couch every Monday. All the developers sit together for an hour to discuss what they’ve been working on. We recently began to collect topics we’d like to take a deep dive into. One of the senior developers suggested we discuss the idea of starting cross-team code reviews. His thoughts were that, while it was a smaller step than launching straight into pair programming, it wouldn’t exactly hurt the levels of communication, collaboration, and knowledge of the company codebases. Over the next few weeks, he gently reinforced the idea while reminding us that we could take it slowly, and nobody was forcing us to review or pair with each other all the time. This casual and unpressured approach helped the practice to become more common. And I loved it - it helped me feel more comfortable communicating and collaborating with other developers.&lt;/p&gt;
&lt;p&gt;As code reviewing increased, I started to feel better about asking for feedback on my work. This is something I can find hard to do because I rarely want to bother busy people and don’t want to be seen as incompetent. It also made me feel like a more integral part of the company as a whole, and I know I’m not the only developer who began to feel more like this. The all-around good vibes reminded me of a past experience of mine that I want to tell you a little story about.&lt;/p&gt;
&lt;p&gt;It’s about one interview I attended in London last year. I sat with a lovely senior developer who told me we were going to solve a coding challenge together. He must have sensed my nervousness because he began by reassuring me that I wouldn’t be doing it all myself, and the exercise was to get a good idea of how I work. We chose the ‘game of life’ challenge. I hadn’t heard of it before. We got straight into it and with what little Javascript experience I had, we got through a good amount of it in 45 minutes. Afterwards, he had a lot of encouraging things to say to me and I felt comfortable and valued by him. I did end up taking another job in the end because London is just so expensive. However, I won’t ever forget how it took less than an hour to feel valued and worthy as a developer, and during an interview no less.&lt;/p&gt;
&lt;p&gt;I heard such a variety of things from other developers who I asked about pair programming. Every story was different. Nobody had had the same, or even a similar experience with pair programming. Some people had always done it, some never. Some companies only pair program! Some had never wanted to, and some want to but can’t. Some only ever found one person they were really comfortable pairing with The message that rung loud and clear is that pair programming doesn’t work in every situation. That’s fair enough. There are many factors at play. Here’s a little story from one developer I talked to.&lt;/p&gt;
&lt;p&gt;This developer said to me: &amp;quot;For years, I didn’t pair program. Then I started working with a new developer. I was very much into high-end CSS and code quality, and my new friend was a fantastic problem solver (which I wasn’t). So, we both managed to learn from each other and the resulting work was just better than what any of us could have done on our own. We ended up pairing for months, and for 6 to 8 hours a day! Especially on complex stories. Despite reservations from our product manager, we enjoyed success. The reasons I see for our success are as follows: Our skills complemented each other, we could see the big picture and edge cases more clearly, mistakes were minimised, we reduced the knowledge island and bottlenecks, we gained shared ownership of the code, and pushed each other’s learning and expertise further.&amp;quot; To bring a dose of reality to this warm and fuzzy sounding tale, the developer finished their story reconfirming my suspicions that pair programming isn’t for everyone. They told me that they know developers who simply prefer working on their own, or need space to focus and be in the zone. The fact that everyone has different personalities, means pairing with others shouldn’t be forced upon anyone, and even if people do pair, there is no set time limit or a set way to do so.&lt;/p&gt;
&lt;p&gt;So, there’s no roadmap. There’s no step-by-step guide in a readme file to successfully install pair programming. In the end, it all depends how you feel about it. Well, and how your company feels about it. In essence, it is flexible.&lt;/p&gt;
&lt;p&gt;For a hint at how flexible pair programming is, I want to take a quick look into some of the different types. For the sake of clarity, I’ll describe junior developers as novices, and seniors as experts.&lt;/p&gt;
&lt;p&gt;We have the one that most people probably think of - the &lt;strong&gt;driver - navigator&lt;/strong&gt;. This is the one I described at the beginning. It&#39;s where the driver uses the computer and controls the main actions. The navigator answers questions and points out potential problems. This can work for an expert and novice where the novice is the driver, but it can also work great for two experts as well.&lt;/p&gt;
&lt;p&gt;Then we have the &lt;strong&gt;backseat navigator&lt;/strong&gt;. Like driver-navigator, the driver sits with hands on the keyboard and types. However this time, the navigator dictates tactical instructions. This could mean telling the driver when to create a method or open a new file. Or what to name a test or a variable. This style works best with the novice as driver, and the expert as the navigator. It gives the novice (i.e someone like me) a chance to learn by doing things the way the expert would.&lt;/p&gt;
&lt;p&gt;The last driving-based metaphor we have is the &lt;strong&gt;tour guide&lt;/strong&gt;. Imagine being a tourist, getting on a bus, enjoying the scenery while someone explains to you what you are seeing. This works really well when the novice is the tourist, and the expert is the tour guide. The expert does the technical thinking, the problem solving and the typing, and, crucially, explains what is happening at every turn. This is the type of pairing I did right at the beginning, and I still do a lot of today. Again, the roles can be switched - with the novice being the tour guide and the expert being the tourist.&lt;/p&gt;
&lt;p&gt;Lastly - and nothing to do with driving, we have &lt;strong&gt;ping-pong-pairing&lt;/strong&gt;. This is the most fun type to say out loud. It’s all about unit tests and test-driven development. The first person writes a failing test and the second gets it to pass. Then the second person writes a failing test and the first gets it to pass. So people take it in turns to be on the ball. Kind of like a game of ping pong. This can work well with any combination of novice or expert because it really facilitates communication and focus, and keeps both members of the pair thinking and learning.&lt;/p&gt;
&lt;p&gt;Remember how I mentioned that we began to do more code reviews at my work? I want to leave you with one more story that I heard recently.&lt;/p&gt;
&lt;p&gt;Two developers I work with (and who also began to take part in the cross-team code reviews) recently decided to spontaneously pair up on a complex set of tasks. Afterwards, during dev couch, they told everyone that they’d achieved beyond what they’d expected, and were really happy with how things went. I asked what type of pairing they’d done, and they said there wasn’t a defined type, and they&#39;d both switched roles a lot. They also said they’d managed to pair for 3 or 4 hours in one afternoon, but thought doing more than that may be too tiring. One developer told me pairing had been really enjoyable as it had enabled both of them to focus really well on the task, and provided much less opportunity to drift off-task and do things like re-factoring code or checking messages. Conversely, the same developer also told me that they usually get the most work done while doing home office.&lt;/p&gt;
&lt;p&gt;So, what I am trying to get across with all these stories is that pair programming is a flexible thing with no strict set of rules. It can start with something small like occasional code reviews. It can be something to try to see whether it works well, and bring a pleasant surprise when you find out it does. It can work well for some developers in some circumstances, and not in others. It’s not something that has to be entirely formalised and it can be fit into what works best for you and your team. By the way, after our last retrospective, my team and I created an actionable item stating that pairing should always be considered for more complex stories.&lt;/p&gt;
&lt;p&gt;What pairing means to my team mates is more robust code, a greater understanding of the codebase, and a closer relationship with each other.&lt;/p&gt;
&lt;p&gt;What it means to me as a new developer is greater confidence, stronger connections with team members, and faster competency. It helps me feel like I am learning at a good pace, and allows me to get welcome feedback from other developers. As a package, this helps me to combat imposter syndrome and feel happier doing my job.&lt;/p&gt;
&lt;p&gt;A collaborative exercise like pair programming helps developers of all levels to communicate, push each other forward, and feel more like a team. After all, a stronger team most likely builds stronger things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have a think about what pair programming could do for you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;~ This blog post is based on the talk I gave on Sunday 6th May 2018 at the Beyond Tellerrand Düsseldorf side event hosted by InVision. ~&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Tempelhof Sunset</title>
      <link href="https://amberwilson.co.uk/blog/tempelhof-sunset/"/>
      <updated>Sat, 28 Apr 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/tempelhof-sunset/</id>
      <content type="html">&lt;p&gt;I love how photography allows you to be as creative as you like. I had some fun taking pics at &lt;a href=&quot;https://en.wikipedia.org/wiki/Berlin_Tempelhof_Airport&quot;&gt;Tempelhof Field&lt;/a&gt; today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/tempelhof-sunset/img/field2.jpg&quot; alt=&quot;Tempelhof field kite flying&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/tempelhof-sunset/img/field3.jpg&quot; alt=&quot;Tempelhof field airport and sunset&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/tempelhof-sunset/img/field4.jpg&quot; alt=&quot;Tempelhof field high chairs&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/tempelhof-sunset/img/field5.jpg&quot; alt=&quot;Tempelhof field kite flying&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>New Camera</title>
      <link href="https://amberwilson.co.uk/blog/new-camera/"/>
      <updated>Sat, 28 Apr 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/new-camera/</id>
      <content type="html">&lt;p&gt;I got a new camera. It&#39;s really lovely. Why do people buy cameras though? Is it to take pictures of their friends, to sit there looking pretty but gathering dust, or to attempt to be recognised as a terrific photographer? Perhaps it is all or none of these. I got mine because I want to have a cool, small piece of equipment on me at all times that I can whip out and make some memories with. I&#39;m not nearly as excited to edit the crap out of the pictures as I used to be a few years ago when I was using my clunky Nikon D5100 though. I also want to take videos with it, and it takes 4K video. Pretty sweet. Although the built-in stabilisation is bad so I&#39;ll need one of those fancy stabilisers on a stick. Here are a few unedited pics I took at Tempelhof Field in Berlin (compressed to 0.43 MB in total, and 336kb for people able to view WebP images.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/new-camera/img/bike-one.jpg&quot; alt=&quot;My bike and shoes&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/new-camera/img/bike-two.jpg&quot; alt=&quot;Bike handles and Tempelhof runway&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/new-camera/img/field.jpg&quot; alt=&quot;Tempelhof field in the evening sunlight&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Apart From Code</title>
      <link href="https://amberwilson.co.uk/blog/apartfromcode/"/>
      <updated>Sat, 28 Apr 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/apartfromcode/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yes, exactly!!!!&lt;/p&gt;&amp;mdash; Amber Wilson (@ambrwlsn90) &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/989514766807904256?ref_src=twsrc%5Etfw&quot;&gt;April 26, 2018&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apart from code, what makes a good developer?&lt;/p&gt;
&lt;p&gt;After a brilliant meeting with &lt;a href=&quot;https://twitter.com/richardbausek&quot;&gt;Richard&lt;/a&gt;, the tech lead at my company, where we discussed my progress as a developer and what I could start aiming for, I came away with some (what I think are) really nice insights from our discussion. I want to share those here.&lt;/p&gt;
&lt;p&gt;I think the advice here builds on my previous &lt;a href=&quot;https://amberwilson.co.uk/blog/beginner-programmer-advice/&quot;&gt;post&lt;/a&gt; from last month on beginner programmer advice. I am writing for everyone, but particularly for new developers, and particularly those developers who may feel a bit lost or hopeless due to the fast-moving pace of the web.&lt;/p&gt;
&lt;p&gt;Ahem, so. Good developers. They write good code. Good code is their output, the end result of their work. It directly produces the stuff that people see. It’s tangible and visible, user experience depends upon it, and it’s what developers are paid to produce.&lt;/p&gt;
&lt;p&gt;To be a good developer, it follows that the developer must write good code. Writing good code is hard. Much harder than I ever thought it would be. There are so many things to consider in the process. Many more things beyond producing something reminiscent to the picture below - i.e. the first sort of code I ever wrote and that allowed me an introduction to web development&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/apartfromcode/img/test.png&quot; alt=&quot;Old and basic HTML code&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Credit and big thanks to Frank Chimero for writing &lt;a href=&quot;https://frankchimero.com/writing/everything-easy-is-hard-again/&quot;&gt;this article&lt;/a&gt; and providing the above picture.&lt;/p&gt;
&lt;p&gt;To be a good developer. This is something I am still learning. But it is fun. Challenging, too. I’m sure I’ll get to the tips in a minute. It feels good to muse for a while, though, don’t you agree? Right, let’s get to it.&lt;/p&gt;
&lt;p&gt;First and foremost, a good developer &lt;strong&gt;debugs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I did read somewhere recently that web development isn’t so much about creativity, as much as it is about fixing wonky code. That while web development is an attractive prospect for those who want to create beautiful and tangible user experiences, developers have to know they’ll mostly be spending a long time debugging in order to make broken code work again. I’ve begun getting in the swing of this by writing &lt;code&gt;console.log();&lt;/code&gt; and &lt;code&gt;debugger;&lt;/code&gt; into my (&lt;code&gt;JavaScript&lt;/code&gt; - other languages have other methods) code. My developer tools are now always open, on a nice, big, separate screen to my browser, text-editor, CLI (other developers may prefer to use Git GUIs), and occasionally Redux dev tools. I am also learning where best to place my debuggers in my code, in order to get the desired result in my console. Something I’ve not done much yet, and I am still not so good at, is isolating code and placing it into either JS Bin or Codepen. Splitting code into smaller units, away from the other code it’s attached to. This is part of a good debugging process. Creating quick prototypes from parts of code where you have discovered a problem or bug. Apart from using &lt;code&gt;console.log();&lt;/code&gt; or &lt;code&gt;debugger;&lt;/code&gt;, developers can also try commenting out &lt;code&gt;include&lt;/code&gt; files one by one, to see if the problem lies in code outside of the file being worked on.&lt;/p&gt;
&lt;p&gt;Ok, breathe. That was a chunky paragraph. The second thing I think a good developer does is follow the &lt;strong&gt;KISS principle&lt;/strong&gt;. My British sensibilities are delighted by saying outloud the long-form of this acronym - “Keep it simple, STUPID!”. Personally, one of the things that overwhelms me as a new developer, coming from a different career, and only having been exposed to table layouts before, is the “here’s a brand new way to do this one thing”™ that happens every few days. I have been lucky, though, to have been (and continue to be) guided by some great people who constantly and kindly remind me that I can relax. See Charlie Owen’s brilliant article &lt;a href=&quot;https://sonniesedge.co.uk/talks/dear-developer&quot;&gt;here&lt;/a&gt; for a deep dive into exactly what I mean. In short, web development doesn’t have to be as overwhelming it seems. Keeping things as simple as they need to be isn’t only something I hear from my friends who are developers. I hear it every day at work. It makes sense that developers build the most simple, MVP version of a feature they can, and then build on it later. This follows the principle of &lt;strong&gt;YAGNI&lt;/strong&gt; (You Ain’t Gonna Need It). Building simple things makes sense because it stands to reason developers will lose a lot of time refining a feature, only to be told the refinements were unnecessary weeks later. I don’t know why I need constant reassurance that simplicity is best, but it is. Although to be honest, I am actually slowly getting better at believing it, and I can already tell I am producing better and faster code because of it.&lt;/p&gt;
&lt;p&gt;Wow, that was an even chunkier paragraph. The third thing a good developer does is &lt;strong&gt;good research&lt;/strong&gt;. I heard this one very, very early on in my web development career. Be a good researcher, aka, know how to Google an answer to a problem or issue. This is an art to be refined over time, as a developer discovers new nooks and crannies of the web that they never knew existed before. Some places are excellent sources of knowledge. I’ve gotten into the habit (does anyone else do this?) of bookmarking nearly every web page I visit that helps me find the answer to a development question. Knowing what words to use in the search bar is very important. It’s quite similar to academic research (something I had to get good at as a psychology student). Searching using the right language helps you find the right material. This gets harder when people use different terms for the same thing, or like to make up their own terms for things that already have names. Another tip is to check the source code of web sites and apps that do the kinds of things you want to do, and learn how those developers did those things. This is of course more difficult these days with the increasing tendency of developers to generate dynamic HTML using JavaScript (something else Frank Chimero talks about in his article). Anyway, to close this paragraph so it doesn’t beat the length of the second paragraph, I’ll leave you with a question. When should you reach out to other developers for help?&lt;/p&gt;
&lt;p&gt;Following from the question at the end of the last paragraph, I’ll finish by saying that good developers should &lt;strong&gt;learn to work well with others&lt;/strong&gt;. What does “well” mean? It depends on your team or the developers, designers, managers, and whoever else you have regular contact with. People in a team tend to be busy, and most of them appreciate being left alone to focus in order to get work done. I have found this to be especially true of developers. In my three months working on a team on a complex project in Berlin, communication has been extensively discussed, as much within retrospectives as out of them. Being a developer is hard, writing good code is hard. Developers have to keep in mind not only the three points from the previous three paragraphs (please recap those, they are important), but also often have to keep complex file trees in mind while desperately trying to focus. As well as this, developers need to think of the quality of their code, whether it is accessible, how performant it is, whether stylelint will accept it, how to alter config to allow a certain piece of code or new feature to work, etc. Regular discussion with other developers around good communication and respecting their space has worked wonders in my team. We are very happy to be working with each other. In the past weeks, I have been pinging other developers over Slack, rather than addressing them directly (this was an actionable item from a retrospective). I often catch developers over lunch, when they are away from their work and tend to be more relaxed. Here, I usually ask them how I could best approach them with issues, ranging from code structure to deployment methods, to CLI issues. Alright, maybe short paragraphs aren’t my thing.&lt;/p&gt;
&lt;p&gt;Short extra tip that I just thought of - a good developer &lt;strong&gt;finds good developer tools&lt;/strong&gt;. I won’t get deeper into this, but I think it’s important to mention. Having a good set of developer tools and utilising the shortcuts in these tools can improve a developer’s development experience. I am quite in awe of the workflow of more senior developers I work with. In a nearly indiscernible flurry of keys, some of these developers achieve the same series of events/outcomes that can take me twice or three times as long. While I do like the more manual way of doing things, I am slowly but surely coming round to using a set of tools (usually tools that are open source and maintained by hard-working developers in their free time) that shave more and more seconds of my development time and cause me to feel less stress. Oh and one other thing, good developers write good &lt;strong&gt;tests&lt;/strong&gt;. I feel like writing a separate post on testing as this is a big part of being a developer (that I certainly wasn’t aware of when starting out).&lt;/p&gt;
&lt;p&gt;TL;DR&lt;/p&gt;
&lt;p&gt;Apart from writing good code (well, in order to actually write good code), a good developer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;debugs&lt;/li&gt;
&lt;li&gt;follows the KISS principle (and respects YAGNI)&lt;/li&gt;
&lt;li&gt;knows how to research&lt;/li&gt;
&lt;li&gt;works well with others&lt;/li&gt;
&lt;li&gt;finds good developer tools&lt;/li&gt;
&lt;li&gt;tests code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many other developers have written extensively about all of the above points. One nice article I found is &lt;a href=&quot;https://24ways.org/2017/levelling-up-for-junior-developers/&quot;&gt;this one&lt;/a&gt; by Dean Hume.&lt;/p&gt;
&lt;p&gt;Please let me know what you think of these tips. If you agree or disagree, I’d love to hear. I hope you can help me learn to be a better developer :)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>JSUnconf</title>
      <link href="https://amberwilson.co.uk/blog/jsunconf/"/>
      <updated>Wed, 18 Apr 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/jsunconf/</id>
      <content type="html">&lt;p&gt;The first &lt;a href=&quot;http://2018.jsunconf.eu/&quot;&gt;unconf&lt;/a&gt; I’ve ever been to just wrapped up and it’s been a really great experience. Not least because of the thoughtful, kind and funny people I was lucky enough to spend it with.&lt;/p&gt;
&lt;p&gt;First of all, I must say that I am exhausted from all of the fun, but I am tired in the best possible way. On top of the tiredness is a feeling of deep contentment, relaxation and all-round good vibes from my experiences. At the conference, everybody was approachable and easy to talk to. The organisers did a fantastic job of getting potential speakers together, introducing them and allowing us to vote for the talks we wanted. We were fed good food, given plenty of yummy snacks, and lots of great swag! The socks must be my favourite.&lt;/p&gt;
&lt;p&gt;For those who haven’t been to an unconference before, this is how it works (well, from what I experienced this weekend) - those who wish to speak are asked to propose their talks before the conference so that the proposals can be collected and pitched at the conference itself. All attendees arrive for registration in the morning (pick up their swag!), are introduced to the conference, hear the code of conduct are shown who to talk to if there are any problems. Then, the potential speakers give short abstracts of their talks, which are numbered. After this, attendees are given a certain number of votes and asked to vote for the talks they want to see. The conference organisers work very hard to collate the votes and quickly produce a talk schedule for everyone. The talks are a defined length (~30 minutes) and are spaced throughout the day with breaks in between. There are usually some drinks tokens provided for attendees to spend at a bar where everyone gathers at the end of the first day.&lt;/p&gt;
&lt;p&gt;At JSUnconf, there was also the opportunity to spend plenty of time relaxing outside with old friends and new friends, getting into some great conversations. The atmosphere the organisers provided for everyone felt wonderful to me. It definitely helped that Hamburg was kind enough to give us some great sunshine!&lt;/p&gt;
&lt;p&gt;There were lots of little things I noticed that the organisers had put in place to help us feel more comfortable and welcome. Little things like placing toiletries and other helpful small things in the bathrooms. I am always so grateful for these little things. I think they make a big impact on how comfortable everyone feels.&lt;/p&gt;
&lt;p&gt;Overall, I learned a lot from the talks and from chatting with the absolutely amazing people who attended. I want to thank all of the organisers for offering me a scholarship ticket including travel and hotel, and being so open and approachable even while running around for us trying to provide everyone the best experience. I always leave events like this feeling so good and motivated. I&#39;m really looking forward to seeing my web (ONESIE!) family again :) By the way, watch out for my mood video, coming soon :D&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/jsunconf/img/jsunconf2.jpg&quot; alt=&quot;Ubahn station with conference friends&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/jsunconf/img/jsunconf3.jpg&quot; alt=&quot;Getting started at jsunconf&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/jsunconf/img/jsunconf4.jpg&quot; alt=&quot;Code review talk&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/jsunconf/img/jsunconf5.jpg&quot; alt=&quot;List of speakers&#39; names&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/jsunconf/img/jsunconf1.jpg&quot; alt=&quot;Onesie Selfie&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://dkundel.com/&quot;&gt;Dominik Kundel&lt;/a&gt; for inviting me and sorting out the Airbnb for everyone. You&#39;re a star!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>House Elves</title>
      <link href="https://amberwilson.co.uk/blog/house-elves/"/>
      <updated>Mon, 02 Apr 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/house-elves/</id>
      <content type="html">&lt;p&gt;I’ve been wanting to write about psychology for a while now. However, despite having quite a few years of formal education in it, I was unsure where to begin.&lt;/p&gt;
&lt;p&gt;My love of psychology is still strong, despite having left the formal study and practice of it behind a couple of years ago. I love to chat about it with people who are as interested as I am in the beauty and mystery of the human mind. I find comfort and growth in doing so. Lucky for me, I have some brilliant friends who I can sit with for hours, reeling off idea after idea, debating, hypothesising and marvelling at what we do and don&#39;t know.&lt;/p&gt;
&lt;p&gt;Because of this, I want to finally begin writing about psychology. A friend of mine shared his opinion that writing about this is probably best left to experts. I tried to tell him I think that people should write about whatever they want. He argued that whatever he could write about psychology has probably already been written about a thousand times. I told him that I’m going to be writer number 1001, and I’m going to write something great that nobody has written before.&lt;/p&gt;
&lt;p&gt;Recently, I have been feeling quite down and unenthusiastic about life. It’s definitely not the first time that’s happened. I find feelings like that always seem to spring from an ever-lengthening downward spiral of negative thought patterns. Along the journey, my enthusiasm and optimism begin to shut down, I withdraw into myself and begin to do the bare minimum to get by. I begin to feel like a burden to people around me, I never want to bother anyone with my feelings, and nothing seems worth doing.&lt;/p&gt;
&lt;p&gt;I have a terrible habit of being consumed by negative thoughts, and letting them dictate how I live my life. It definitely feels easier to do that, to be puppeteered by an unknown but powerful force, than to take your rock-climbing tools, and scale yourself to the top of the dark empty pit you’re in. Maybe this is due in part to laziness, to entitlement or to an inability to see how good taking control of your life can be. It could be none of those things. Who knows? That’s one of the many mysteries of being human that we may never find out.&lt;/p&gt;
&lt;p&gt;Anyway, while I am prone to be a puppet in the story of my own life, I am also vividly interested in ways people are able to overcome this unhappy and rather pitiful theatre. Some days, I am able to gather enthusiasm to explore more ways to be happy and in control. One way I’ve been doing this recently is by reading.&lt;/p&gt;
&lt;p&gt;Books, writers, libraries, research and anything else to do with writing have been things I have respected for a long time, as long as I can remember. Even so, reading has not always come naturally to me. Over my childhood, I read a few books here and there, but I never read consistently. Throughout my teens I read even less and my 20s didn’t get off to a very rich literary start either. Only in the past month have I picked up and dusted off my Kindle, which I’ve completely ignored for about three years, and begun to read again. And this time I am loving it. I actually look forward to coming home and reading. And, now that I am doing it, I really really wish I’d begun earlier. Everyone should read books. Not only one type, either. Fact and fiction both contain their own unique magic. Inspired by &lt;a href=&quot;https://adactio.com/journal/13242&quot;&gt;Jeremy Keith&lt;/a&gt;, I have decided to read a good balance of both factual books and novels.&lt;/p&gt;
&lt;p&gt;So, I am supposed to be writing about psychology - in this case, how to be more in control of your life. I want to talk about one of my favourite things that I’ve discovered from a month of reading books. All authors have their own unique style - this is great! Being exposed to different perspectives and personalities is brilliant. Nearly all writers make use of metaphors to make their writing come alive and to give their readers an alternate angle to look at life from. This is invaluable for those of us that tend to wallow in our own negative and gloomy perspectives, gradually believing more and more that this is how things are meant to be and there’s no point in changing them.&lt;/p&gt;
&lt;p&gt;Perspectives other than our own bring a breath of fresh air. They open doors and allow light to flood in. They wrap us in a warm, comforting blanket by letting us know other people go through similar struggles. There is a tonne of writing out there that exists because the author suffered through something. Suffering tends to give you a strong desire to prevent others experiencing similar pain, just like this author of this &lt;a href=&quot;https://thehealappeal.com/navigating-and-fixing-relationship-problems/#taking-action&quot;&gt;post about relationships&lt;/a&gt;. Writing books is a great way to tell your story of suffering to a wide audience. The book I am reading right now is called ‘Big Magic: Creative Living Beyond Fear’ by Elizabeth Gilbert. Her writing is beautiful and funny and whimsical and amazing. It’s also really down-to-earth. I imagine she is a really fun and interesting person to know. Anyway, amongst many lovely perspectives she shares, is one of my new favourites. One that I’m sure I’ll never forget. While talking about creativity, she says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…the Greeks and Romans both believed the idea of an external daemon of creativity - a sort of house elf, if you will, who lived within the walls of your home and who sometimes aided you in your labors. The Romans had a specific term for that helpful house elf. They called it your genius - your guardian deity, the conduit of your inspiration. Which is to say, the Romans didn’t believe that an exceptionally gifted person &lt;em&gt;was&lt;/em&gt; a genius; they believed that an exceptionally gifted person &lt;em&gt;had&lt;/em&gt; a genius.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perhaps this passage doesn’t make too much sense when read out of context of the rest of the book, but I wanted to share it because it’s something that made me feel good. It made me feel like it’s okay to not always be producing amazing work, to give myself a break and to not always put myself down (i.e. plummet down a negative spiral) when I feel less motivated and inspired than I did the week before. This small history lesson reminded me that humans aren’t perfect, and that people should never feel under pressure to perform all the time - unless they want to feel terrible about themselves. Sometimes my creative house elf goes off to do its own thing. It’s still there, and it’s still loyal. It simply sometimes needs its own space and time to relax and unwind. And so do I. I think you and your genius can be a good team, always supporting and building each other up, and reminding each other that its okay to take a break once in a while.&lt;/p&gt;
&lt;p&gt;I imagine my house elf is a bit like &lt;a href=&quot;https://www.pottermore.com/explore-the-story/dobby&quot;&gt;Dobby&lt;/a&gt; from Harry Potter. A kind creature who always has something nice to say, and helps keep me positive. I think we all need a positive house elf in our life. What do you think?&lt;/p&gt;
&lt;div class=&quot;text-align-center-utility&quot;&gt;
    &lt;img src=&quot;https://amberwilson.co.uk/blog/house-elves/img/dobby.png&quot; alt=&quot;Dobby the house elf from Harry Potter&quot; /&gt;
&lt;/div&gt;
</content>
    </entry>
    
    <entry>
      <title>Nobody Said CSS Is Easy</title>
      <link href="https://amberwilson.co.uk/blog/nobody-said-css-is-easy/"/>
      <updated>Wed, 28 Mar 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/nobody-said-css-is-easy/</id>
      <content type="html">&lt;p&gt;Wait, some people have said this. But I&#39;d like to politely voice the opinion that they are wrong.&lt;/p&gt;
&lt;p&gt;For almost two months, I have been working on a complex React project involving a complex SCSS implementation. I am new to such complex projects, and so have only just begun to really learn about what SCSS can do. And... there is a &lt;em&gt;lot&lt;/em&gt; to learn. But, it is a beautiful mess ❤️&lt;/p&gt;
&lt;p&gt;Before diving into the project two months ago, I refreshed my awareness of &lt;a href=&quot;https://sass-lang.com/guide&quot;&gt;Sass basics&lt;/a&gt;. Then, I opened the project code in my text editor, and jumped in. I was dazzled by the lines and lines of multi-coloured code, immediately puzzled when I saw countless @ $ _ and, something I hadn&#39;t expected - functions. Up until now, I hadn&#39;t written much of my own SCSS, and to be honest, I still haven&#39;t. However, I am proud that I wrote a fully-functioning each loop in SCSS last week :)&lt;/p&gt;
&lt;p&gt;I was actually inspired to write this article after another fairly long struggle trying to style a component. I had to add a focus state to a custom checkbox. This seemingly simple task led me down a few rabbit holes. I learned a lot about the difficulties of styling a custom checkbox (i.e. one that is not browser-implemented).&lt;/p&gt;
&lt;figure class=&quot;figure__border&quot;&gt;
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/The_native_form_widgets&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/nobody-said-css-is-easy/img/browser-checkbox.png&quot; alt=&quot;Browser-implemented checkbox styles&quot; /&gt;&lt;/a&gt;
&lt;figcaption&gt;^ Browser-implemented checkbox styles&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;figure__border&quot;&gt;
&lt;a href=&quot;http://wtfforms.com/&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/nobody-said-css-is-easy/img/custom-checkbox.png&quot; alt=&quot;Custom checkbox style&quot; /&gt;&lt;/a&gt;
&lt;figcaption&gt;^ The custom checkbox style I wanted&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;After reading a few articles and finding lots of similar but differing opinions, I asked another developer, &lt;a href=&quot;http://nevanscott.com/&quot;&gt;Nevan&lt;/a&gt;, to come and help me.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.cp-#&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;__input:focus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;~ .cp-#&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;__dummy&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;border-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp-get-color-action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cta&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;    &lt;span class=&quot;token selector&quot;&gt;~ .cp-#&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;__label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 700&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Above is code from the project. I knew I had to work on this specific piece of code in order to get a focus state on the checkboxes. See the little tildes (&lt;strong&gt;~&lt;/strong&gt;)? Nevan pointed out to me that these can be used as a special CSS selector, making the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/General_sibling_selectors&quot;&gt;general sibling combinator&lt;/a&gt; possible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/nobody-said-css-is-easy/img/csslesson.jpg&quot; alt=&quot;CSS lesson from a developer at my workplace&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We talked through different CSS selectors and Nevan drew some out for me. Once I&#39;d learned what the general sibling combinator does, I was able to write the below code, which gave me a nice focus state for my checkbox:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.cp-#&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;__input:checked:focus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;~ .cp-#&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;$type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token selector&quot;&gt;__dummy&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0 0 0.075rem &lt;span class=&quot;token function&quot;&gt;cp-get-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;base&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 0 0 0.2rem &lt;span class=&quot;token function&quot;&gt;cp-get-color-action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cta&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I have come to realise that a lovely side-effect of working on a large project &amp;amp; using SCSS has been an increasing awareness of how &amp;amp; where to implement accessibility. I will write about this in another blog post. One thing I gained a stronger awareness of (simply from working with checkboxes) is that it&#39;s important to progressively enhance UI components, so that a fancy custom one is able to fall back to the default browser styles and functionality. This way, a user can still access the UI if JavaScript or CSS fail.&lt;/p&gt;
&lt;p&gt;In conclusion to my first two months on a big project, I now know that getting confused, spending a long time studying many different files &amp;amp; folders, and asking other developers for help is a right of passage to becoming a better developer. I completed &lt;a href=&quot;https://flukeout.github.io/&quot;&gt;CSS Diner&lt;/a&gt; a long time ago. However, nothing increases your learning power more than working on something big, real, confusing and frustrating ;)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Books</title>
      <link href="https://amberwilson.co.uk/blog/books/"/>
      <updated>Fri, 23 Mar 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/books/</id>
      <content type="html">&lt;p&gt;I am starting this post almost 4 months too late, but I want it here so I can be kept (at least a little) accountable for starting (and finishing!) as many books as I can.&lt;/p&gt;
&lt;p&gt;Most of the books I read are recommended by friends. Any others will either be completely random or based on my interest in science, design, psychology or philisophy. Some will be about things that I really think I should know more about, like politics.&lt;/p&gt;
&lt;p&gt;Here are the books I have read so far:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/shakespeare.jpg&quot; alt=&quot;Front cover of Shakespeare by Bill Bryson&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Shakespeare - Bill Bryson&lt;/p&gt;
&lt;p&gt;A really cool insight into just how hard people have tried to gather reputable, solid evidence about Shakespeare&#39;s life and who he actually was. Throughout, it becomes ever clearer that the truth is likely forever lost. I loved the picture that&#39;s painted of Shakespearean London, and the antics of other prominent figures from the time period.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/inhgyaihgywtb.jpg&quot; alt=&quot;Front cover of it&#39;s not how good you are, it&#39;s how good you want to be by Paul Arden&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s Not How Good You Are, It&#39;s How Good You Want To Be - Paul Arden&lt;/p&gt;
&lt;p&gt;Rollercoaster of good ideas that were learned from a career in advertising. Stuffed full of tasty advice on how to be creatively brilliant. Insights into the minds of clients and what they really want. And that they don&#39;t want what you think they probably want. We may all hate adverts, but really we are all selling something. &amp;quot;We are all in advertising. It&#39;s a part of life.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/allneonlikelove.jpg&quot; alt=&quot;Front cover of All Neon Like Love by Dan Gennoe&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All Neon Like Love - Dan Gennoe&lt;/p&gt;
&lt;p&gt;First novel I&#39;ve read in a long time, and I&#39;m proud that I did! This story is a psychological, often dark, and always thorough, look into the mind of a man obsessing over a women he thinks he knows. We hear plenty about his sadness, his thoughts, his anxieties and concerns. Bit hard to get through at times, but I think it&#39;s worth it. I like how it made me feel a range of emotions, made me empathise with the characters, and painted vivid pictures using great descriptive language. Think those are signs of a good book.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/bigmagic.jpg&quot; alt=&quot;Front cover of Big Magic: Creative Living Beyond Fear by Elizabeth Gilbert&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Big Magic: Creative Living Beyond Fear - Elizabeth Gilbert&lt;/p&gt;
&lt;p&gt;Where can I start with this book. I&#39;ve never highlighted a book so many times, never read something and thought &amp;quot;yes, I do that&amp;quot; or &amp;quot;that&#39;s me!&amp;quot; so many times. This book contains messages that I will never forget. Messages that people are probably generally aware of, but that get buried under fear, anxiety, lack of confidence, doubt etc. It&#39;s a rare thing for me to read something and feel so confident that it has changed my life for the better. But this one has. The wise, funny and completely relatable Liz Gilbert has an honest, no-bullshit conversation with you. A conversation that feels like it&#39;s over coffee and she&#39;s known you for years. Thank goodness for people like her.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/womenandpower.jpg&quot; alt=&quot;Women and Power by Mary Beard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Women and Power: A Manifesto by Mary Beard&lt;/p&gt;
&lt;p&gt;A short and thought-provoking book. Mary Beard deconstructs some of the history behind the lack of women in power today. She uses clever and interesting analogies and brings together pieces of information that I am sure people who aren&#39;t looking might miss. I wish it would have been longer. Definitely a good read for anybody curious about the balance of power between men and women in various positions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/psychologyfordesigners.jpg&quot; alt=&quot;Psychology for Designers by Joe Leech&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Psychology for Designers by Joe Leech&lt;/p&gt;
&lt;p&gt;A sweet and short introduction to psychology and design. Joe tells us his story, his experience with academic psychology and human computer interaction. He provides many examples and resources. Reminded me a lot of my own academic studies in psychology. My favourite part was at the end of the book in &#39;Extras&#39; where he talks about myths and key findings in those areas of psychology that are most important to design. I particularly like the idea of mental models. A really nice little book. There are some spelling and grammar mistakes but I&#39;m personally nitpicky about that stuff.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/real.jpg&quot; alt=&quot;Real - the inside-out guide to being yourself by Clare Dimond&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Real - The Inside-out Guide to Being Yourself by Clare Dimond&lt;/p&gt;
&lt;p&gt;At risk of sounding cliché... where has this book been all my life? I&#39;ve never read such a pure, real or beautiful book. I repeat the words inside it to myself daily... &amp;quot;There is only the moment, we are merely an idea of a self, thoughts rushing through us like waves. We only exist in the prescence of another. We need nothing, we are already all we&#39;ll ever need&amp;quot;. Another life-changing book for me. Absolutely and completely.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/oneofthosefaces.jpg&quot; alt=&quot;A Man with One of Those Faces by Caimh McDonnell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A Man with One of Those Faces by Caimh McDonnell&lt;/p&gt;
&lt;p&gt;I&#39;m not one to usually go for crime novels, but the prologue made me laugh so I gave it a go. A great thing about this book is that it&#39;s set in Ireland and that the author has portrayed everyone&#39;s accents and personalities perfectly. The characters are great. I love the way the story twists and turns and is really not that predictable at all. Looking forward to reading the next three books in the series!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/daythatnevercomes.jpg&quot; alt=&quot;The Day That Never Comes by Caimh McDonnell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Day That Never Comes by Caimh McDonnell&lt;/p&gt;
&lt;p&gt;Just as funny and surprising as the prequel!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/curious-charms.jpg&quot; alt=&quot;The Curious Charms of Arthur Pepper by Phaedra Patrick&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Curious Charms of Arthur Pepper by Phaedra Patrick&lt;/p&gt;
&lt;p&gt;A lovely book that had lots of English-y things for me to identify with. It is very centered around communication between family members and about the struggles normal people face. There were lots of moments that had me nodding my head and feeling emotional - especially where Arthur was reflecting about his life. Really glad I picked this little gem up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/howtostoptime.jpg&quot; alt=&quot;How To Stop Time by Matt Haig&quot; /&gt;&lt;/p&gt;
&lt;p&gt;How To Stop Time by Matt Haig&lt;/p&gt;
&lt;p&gt;Saw a friend reading this on Sunday afternoon, July 8th and by Tuesday evening, July 10th I had finished it. Beautifully and poignantly written. I could barely put it down and couldn&#39;t wait to pick it up again. I got lost in the fascination of a person&#39;s experience through time. Great messages in the book as well. I am sure anyone would enjoy many of the quotes in there. I loved it, loved it, loved it. &lt;em&gt;Even&lt;/em&gt; if it rather often reminded me of a movie script.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/notes.jpg&quot; alt=&quot;Notes On A Nervous Planet by Matt Haig&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Notes On A Nervous Planet by Matt Haig&lt;/p&gt;
&lt;p&gt;I had high expectations of this book, because the last book I read by Matt was so good. Unforunately I didn&#39;t like this one as much. The subject matter is great, but it felt as if the book was rushed and could have used a much more coherent structure. That&#39;s not to say I didn&#39;t get anything out of it - I did. I love any honest portrayal of mental health issues and ways to move forward. The content could have been organised a lot better. I sped-read the last 50 pages.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/tobeacat.jpg&quot; alt=&quot;To Be A Cat by Matt Haig&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To Be A Cat by Matt Haig&lt;/p&gt;
&lt;p&gt;I bought this third book by Matt Haig after reading glowing reviews. I knew beforehand it is meant as a kids book (although I am really unsure what age) but that it was okay for adults, too. I am unsure of the age because some parts are a bit more graphically described than they need to be and I didn&#39;t like that the main character has freckles and this is made out to be a bad thing (?!). Skipped over a few pages. There is a nice message hidden there somewhere about how it&#39;s important to be yourself and like who you are, but some of the ideas and writing style I didn&#39;t like much at all.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/angelsinthemoonlight.jpg&quot; alt=&quot;Angels in the Moonlight by Caimh McDonnell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Angels in the Moonlight by Caimh McDonnell&lt;/p&gt;
&lt;p&gt;Didn&#39;t realise this was the prequel to all three of Caimh McDonnell&#39;s Dublin crime trilogy books. I loved how there was so much Bunny in it, and you&#39;ve got to read it to know what I mean. Very interesting characters, with even more interesting stories and ideas. There were parts that had my eyes glued to the page. There were parts that made me laugh my head off (metaphorically, not literally). This book, like its relatives, are so clever. The language and humour is a total delight. Super duper happy I stumbled across this series.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/americanpsycho.jpg&quot; alt=&quot;American Psycho by Brett Easton Ellis&quot; /&gt;&lt;/p&gt;
&lt;p&gt;American Psycho by Bret Easton Ellis&lt;/p&gt;
&lt;p&gt;I didn&#39;t really get it. I think the message is supposed to be that we shouldn&#39;t be too materialistic, and some people are psychopaths. Was difficult to finish because nothing about it really hooked me in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/animalfarm.jpg&quot; alt=&quot;Animal Farm by George Orwell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Animal Farm by George Orwell&lt;/p&gt;
&lt;p&gt;Tried reading this as a child but couldn&#39;t get into it. I was glad to be able to enjoy it this time. It&#39;s fascinating for a few reasons. First is the writing style, which is understandably old-fashioned as the book was written in the 1940s. Second is how it reminded me of how society is fed lies to keep everybody calm and placated, most often for the benefit of the few. Third is the real-life events the story was based on. I only glanced at the Wikipedia article so far, but I recommend giving it and the book a read if you&#39;re interested.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/manithinkiknow.jpg&quot; alt=&quot;The Man I Think I Know by Mike Gayle&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Man I Think I Know by Mike Gayle&lt;/p&gt;
&lt;p&gt;Got this because of glowing reviews saying what a feel-good novel it is. It started out alright, because the format of the unlikely friendship seems unique. The entire book lacked any sort of depth for me, though. It&#39;s written in such a pallid, bland and sickeningly oversimplified way. I rolled my eyes at least a few times throughout. I don&#39;t understand how people could be crying and so deeply touched by it. Each to their own.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/books/img/eleanoroliphant.jpg&quot; alt=&quot;Eleanor Oliphant is Completely Fine by Gail Honeyman&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Eleanor Oliphant is Completely Fine by Gail Honeyman&lt;/p&gt;
&lt;p&gt;A friend recommended this book via an Instagram story. She said that the story gets into the main character&#39;s head and deals with all the emotions. This is true. I found the book hard to get into at the beginning, but the last half is better. Some characters I liked, some I wasn&#39;t so sure about. There have been some people that bash the book&#39;s attempt to highlight the effects of trauma and I can understand the criticism, but it still gets some good points across in my opinion. Would be interested in the same sort of story where the main character experienced more subtle sorts of abuse than the main character in this book, since I believe many thousands of people suffer much more hidden sorts of abuse.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Beginner Programmer Advice</title>
      <link href="https://amberwilson.co.uk/blog/beginner-programmer-advice/"/>
      <updated>Tue, 13 Mar 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/beginner-programmer-advice/</id>
      <content type="html">&lt;p&gt;I realised I published &lt;a href=&quot;https://amberwilson.co.uk/blog/newbie-dev-tips/&quot;&gt;Newbie Dev Tips&lt;/a&gt; nearly seven months ago. I found it super interesting to reflect on my opinions then versus now :)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you want to get really good at a programming language, write stuff in it over and over, and only then take a deep dive into reading a book or watching a lot of tutorials about it. I’ve heard and lived this advice myself one hundred times over, and when I inevitably stray from it, I always find myself going back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can’t know it all. Even if you try for a hundred years. All developers, no matter their experience, still poke around in the dark trying to figure out what works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the beginning, shorter and more basic tutorials are best. However, it can take time to find a tutorial that explains things in a way or context that&#39;s right for you. If a tutorial doesn’t feel right, look for more and you’ll find one that speaks to you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learning a programming language is sort of like learning a spoken language – take a look at the similarities between them and how people best learn to speak a language, and I think it’ll help guide you to learn a programming language.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do try to search for and attend local events and meetups near you. My network of friends who work on the web is worth its weight in gold.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talk to as many web people as possible. Some of their stories will amaze you, and you will learn so many different things from them. However, remember that everyone has an opinion and it’s best to receive advice light-heartedly, and not to take anyone’s opinion as law.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try to focus on one thing at a time. This can help you avoid being overwhelmed and experiencing racing thoughts like “how did anyone ever learn how to do this?!” or “I must not be cut-out for this”. See earlier point about how nobody can ever know it all. It&#39;s also a general rule that many more abstract or complex topics can escape your attention in the beginning. You&#39;re bound to run into them again, and by then you&#39;ll be better prepared to understand them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may have to spend days or weeks on learning a single topic or a small part of what a particular language can do. Don’t pressure yourself. Going at your own pace and enjoying yourself is what matters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The most important thing is to not give up. You’ll have good days and bad days. Sometimes the bad days are so bad that you begin to wonder why you should tap yet another key. The good days will shine like a bright light, feel so amazingly satisfying, and make you feel on top of the world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I had to choose my favourite thing that programming has taught me so far – it’d be that nothing needs to be perfect. Conditions don’t need to be perfect before you start, they don’t need to be perfect during a task, or even after the task is done. This lesson has impacted more than one area of my life in a really positive way.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Unit Tests</title>
      <link href="https://amberwilson.co.uk/blog/unit-tests/"/>
      <updated>Mon, 05 Feb 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/unit-tests/</id>
      <content type="html">&lt;p&gt;This is a bit of a retrospective post, because the things I’m going to talk about happened on the last day of January. It was the day before my new job began, and I’d been in Berlin for 10 days. I had signed up to a codebar Berlin meetup about a week before, as a student, and was really excited to go along and see what codebar in Berlin was like. Before I moved to Berlin, I’d been part of codebar Brighton for about 1.5 years as a student, coach and organiser.&lt;/p&gt;
&lt;p&gt;I had chosen to focus on the 7th JavaScript lesson – &lt;a href=&quot;http://tutorials.codebar.io/js/lesson7/tutorial.html&quot;&gt;Introduction to Testing&lt;/a&gt;. There was a good reason for this! After my first 6-month long internship as a web developer, I had either worked on or had an overview of a few large projects. I&#39;d seen every developer devote a really large chunk of time to testing their code - and in multiple different ways. So I knew that &lt;strong&gt;testing is really, really important&lt;/strong&gt;, and I definitely wanted to know more about it. I knew that unit tests are designed specifically to test code in isolation, and that they are the simplest ones to write and run. So, I decided I wanted to ask my coach about unit tests, and hopefully try writing some.&lt;/p&gt;
&lt;p&gt;When I arrived at codebar, I found the venue, hosts, organiser, coaches and students to be really wonderful. I was paired with a lovely guy, &lt;a href=&quot;https://twitter.com/bruderstein&quot;&gt;Dave&lt;/a&gt;. I asked him about unit tests and he said rather than follow the tutorial, it&#39;d be a nice idea to search through one of my &lt;a href=&quot;https://github.com/ambrwlsn/christmas-gifts&quot;&gt;existing projects&lt;/a&gt;, take a snippet of code from it, and re-write it using unit tests and TDD (Test-Driven Development). I&#39;ve written more about TDD below.&lt;/p&gt;
&lt;p&gt;The code in question was this function:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validatePrice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $price &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;price&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; priceValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $price&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^[1-9]&#92;d*(((,&#92;d{3}){1})?(&#92;.&#92;d{0,2})?)$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; invalidMessageNotDisplayed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.invalid_price_span&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; isValid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; regex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;priceValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isValid &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; invalidMessageNotDisplayed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;showInvalidPriceMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$price&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; isValid
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This function is designed to validate user-inputted prices. It isn’t the messiest function ever, but there is definitely room for re-factoring.&lt;/p&gt;
&lt;p&gt;Dave suggested we use the popular testing framework &lt;a href=&quot;https://facebook.github.io/jest/&quot;&gt;Jest&lt;/a&gt;, and the command line, to help me re-write the function, and write my first ever unit tests.&lt;/p&gt;
&lt;p&gt;I created a new folder with the command line &lt;code&gt;mkdir price&lt;/code&gt;, I targeted the folder &lt;code&gt;cd price&lt;/code&gt;, and ran &lt;code&gt;npm init&lt;/code&gt;. My &lt;code&gt;package.json&lt;/code&gt; data was created. I then ran &lt;code&gt;npm install --save jest&lt;/code&gt;. My &lt;code&gt;package.json&lt;/code&gt; then looked like this:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;price&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jest&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;author&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;license&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ISC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&quot;jest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^22.1.4&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I opened my text editor and added my new price folder to my workspace. Within the folder, I created a file - &lt;code&gt;validate_price.js&lt;/code&gt;. In here, I created an empty function - &lt;code&gt;validate_price&lt;/code&gt;. Beneath the function, I made sure to add a line of code that enables the file contents to be exported - &lt;code&gt;module.exports = validate_price&lt;/code&gt;. I then created a sub-folder - &lt;code&gt;__tests__&lt;/code&gt;. I formatted the name like this so Jest can recognise it. In this sub-folder, I created a file - &lt;code&gt;validate_price.spec.js&lt;/code&gt;, which Jest can also recognise. In this file, I wrote - &lt;code&gt;var validate_price = require (‘../validate_price’)&lt;/code&gt;, to link it with my &lt;code&gt;validate_price&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;Dave then showed me the syntax for writing unit tests with Jest:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;validate_price&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;accepts numbers without decimals&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validate_price&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;45&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I had just written my first ever unit test! I ran &lt;code&gt;npm test&lt;/code&gt; in the command line, triggering Jest to run. The result was:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/unit-tests/img/test_one.png&quot; alt=&quot;unsuccessful unit test&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The result helpfully informed me that my &lt;code&gt;validate_price&lt;/code&gt; function was still empty (i.e. not defined). I then wrote just two words inside my function, ‘return false’. I ran &lt;code&gt;npm test&lt;/code&gt; again. I got another failed test. This is because the expected value (boolean) had been ‘true’, and it had received the boolean ‘false’. When I changed the boolean to ‘true’, the test passed!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/unit-tests/img/test_two.png&quot; alt=&quot;successful unit test&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I then added a second unit test to my &lt;code&gt;validate_price.spec.js&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;declines values with non-digits&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validate_price&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;foo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What do you think would happen if &lt;code&gt;npm test&lt;/code&gt; was run now? You may or may not have guessed correctly, but we get this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/unit-tests/img/test_three.png&quot; alt=&quot;unsuccessful unit test&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is because we have ‘true’ written in our function, and the expected result of this test is ‘false’. So our first unit test passes, and our second one fails. This is easily fixed by creating an ‘if, else’ statement that returns true or false, depending on whether the input is a number or not.&lt;/p&gt;
&lt;p&gt;It was at this point that Dave began to further explain what Test Driven Development (TDD) is. This is an agile method whereby an empty function is written, and each part of the function is written just well enough so it passes a test written specifically for it, and is then refactored. This helps code to be as DRY and readable as possible. Read more about TDD &lt;a href=&quot;https://www.agilealliance.org/glossary/tdd/#q=~(filters~(postType~(~&#39;page~&#39;post~&#39;aa_book~&#39;aa_event_session~&#39;aa_experience_report~&#39;aa_glossary~&#39;aa_research_paper~&#39;aa_video)~tags~(~&#39;tdd))~searchTerm~&#39;~sort~false~sortDirection~&#39;asc~page~1)&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dave also told me about red, green, refactor (RFR). Uncle Bob does an amazing job of describing this &lt;a href=&quot;http://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the RGR cycle tells us to first focus on making the software work correctly; and then, and only then, to focus on giving that working software a long-term survivable structure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, write a unit test for a specific bit of code before you even write that code so that the test initially fails (red), write code that makes the test pass (green), then refactor the code to be readable, DRY, maintainable, and built for the future.&lt;/p&gt;
&lt;p&gt;I had unknowingly already been doing this. I had written my first unit test before writing the code that it was meant to test. The test failed (red). I then wrote code, any code, that would make the test pass (i.e. &#39;return true&#39;). The test passed (green). I then re-wrote the code so that it’d make sense to other developers. The code was refactored (refactor).&lt;/p&gt;
&lt;p&gt;Next, Dave and I talked about my next task - how I could write code that would allow both unit tests to pass, without having to use an &#39;if, else&#39; statement. We decided to use a regular expression. Dave helped me write the regular expression from scratch, which we tested using this &lt;a href=&quot;https://regex101.com/&quot;&gt;cool site&lt;/a&gt; that I had never heard of. In the end, we came up with this, which looks pretty nice if I say so myself:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;validate_price&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^[0-9]+$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; regex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;price&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; validate_price&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few minutes before codebar wrapped up for the evening, I wanted to ask Dave the difference between unit tests and a few other testing methods I have been exposed to as a new developer - integration tests, end-to-end tests and browser testing. He answered my question by drawing out the &amp;quot;testing pyramid&amp;quot; for me. This is explained really well &lt;a href=&quot;http://www.agilenutshell.com/episodes/41-testing-pyramid&quot;&gt;here&lt;/a&gt; (there&#39;s also a video). Basically, at the bottom there are unit tests, above there are integration tests, and at the top there are user interface/end-to-end tests. The other kinds of testing (other than unit testing) are beyond the scope of this post, but I plan to write about them later!&lt;/p&gt;
&lt;p&gt;Overall, I had a great time learning about Jest, unit tests, testing in general and using regular expressions. I love how unit tests allow developers to write really nice code that is more likely to be understood by other developers.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Inclusionary and Exclusionary Language</title>
      <link href="https://amberwilson.co.uk/blog/inclusionary-exclusionary-language/"/>
      <updated>Sat, 03 Feb 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/inclusionary-exclusionary-language/</id>
      <content type="html">&lt;p&gt;Today I attended the &lt;a href=&quot;https://www.globaldiversitycfpday.com/&quot;&gt;Global Diversity CFP Day&lt;/a&gt; – Berlin style. There were 13 amazing mentors and over 20 students – all of us hosted by the awesome &lt;a href=&quot;https://www.stefanjudis.com/&quot;&gt;Stefan Judis&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/irina_botea?lang=en&quot;&gt;Irina Botea&lt;/a&gt; in the Contentful offices. The day was pre-planned for us by the great &lt;a href=&quot;https://twitter.com/jiggy_pete?lang=en&quot;&gt;Peter Aitken&lt;/a&gt;. We watched inspiring educational videos, had discussions and completed exercises. The exercise which struck the biggest chord with the participants was the one on use of exclusionary language within public speaking, and how we can work to be much more inclusionary. Two groups of around 15 people discussed and wrote their ideas down so they could be presented to everyone. Here were the things (formatted as &lt;u&gt;issues&lt;/u&gt;) that my group discussed:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Issue #1: general language use&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Words like ‘sexy’ or ‘crazy’ can make people uncomfortable, because the use of such words varies greatly across cultures and languages. Words like these that might seem low-level offensive or part of everyday conversation for some may be taboo and highly offensive to others. There is no way to tell if such words will be received as derogatory, so they should not be used.&lt;/li&gt;
&lt;li&gt;Swearing can also make people uncomfortable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #2: addressing people in the audience&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Even a seemingly neutral greeting such as “hey guys!”, which is appropriate in many but not all places, may confuse audience members, especially if English is not their first language.&lt;/li&gt;
&lt;li&gt;When you address people, try to do so in a way that includes everyone, for example “hey everyone!”.&lt;/li&gt;
&lt;li&gt;Women are not “girls”, just as men are not “boys”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #3: jokes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are some jokes you may wish to include in your talk that seem normal to you, or that you may be desensitised to. However, there is no guarantee that everyone in the case for everyone in the audience.&lt;/li&gt;
&lt;li&gt;Dry jokes (i.e. ‘dad’ jokes) that do not belittle or offend others in any way are usually acceptable, but conference organisers should always be informed. This is because the organisers of a conference or any public speaking event are the ones who know the audience best. They are the people to go to for discussing any jokes you wish to use.&lt;/li&gt;
&lt;li&gt;Jokes should build people up, but never knock them down.&lt;/li&gt;
&lt;li&gt;Don’t joke about other people&#39;s job titles, tech stack, or anything else. Never try to make yourself look good by belittling others.&lt;/li&gt;
&lt;li&gt;Don’t translate jokes from your native language into the target language of the event.&lt;/li&gt;
&lt;li&gt;Jokes that are designed to make fun of yourself, in an acceptable self-deprecating way, may be okay. Always check with the event organisers as there may still be people who will not understand such jokes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #4: potentially offensive material in your talk&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As mentioned above, it is a great idea to discuss potentially offensive material in your talk with the event organisers before you present it to your audience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #5: stereotyping&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sterotyping may delight some audience members and offend others.&lt;/li&gt;
&lt;li&gt;Leave it out of your talk altogether.&lt;/li&gt;
&lt;li&gt;Never assume anything about other cultures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #6: sexualisation of speakers or audience members&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is &lt;u&gt;never&lt;/u&gt; appropriate! There have been highly publicised cases of this, but it unfortunately still happens.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #7: not knowing whether you’ve made the audience uncomfortable&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be open to feedback!&lt;/li&gt;
&lt;li&gt;Present yourself as approachable!&lt;/li&gt;
&lt;li&gt;On your last slide you could, for example, add some information that would give your audience the chance to provide anonymous feedback on any aspect of your talk. Also tell people they can approach you with feedback, but keep both options open for those who are more comfortable remaining anonymous.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #8: leaving out attendees&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is a point for both speakers and all other people present at a speaking event – if you see someone looking lost or left out, ask if they need help, or invite them into your circle to join the discussion you are having.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #9: audience knowledge levels&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While giving your talk, ask your audience about their experience levels or what technology they have used before. This way, you can direct your talk content to focus more on what is relevant to those listening.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #10: advanced vs. beginner&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be aware of the curse of knowledge!&lt;/li&gt;
&lt;li&gt;When talking about a topic you know very well, you may leave out information that is relevant for beginners.&lt;/li&gt;
&lt;li&gt;Do not feign surprise when the person you’re talking to knows nothing about your topic, as this can be condescending.&lt;/li&gt;
&lt;li&gt;Do not assume someone’s level of knowledge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #11: complexity&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the rule of least power in your talks – i.e. use the simplest language possible that will still convey the lessons or message you wish the audience to take away. This means make your talk as complex as it needs to be, but not more.&lt;/li&gt;
&lt;li&gt;Being able to explain a complex topic in a simple or novel way is an indicator that you, as a speaker, really understand the topic itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #12: exerting your privilege&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be aware of any privilege you may have, and be careful when talking about how much it benefits you.&lt;/li&gt;
&lt;li&gt;You may, for example, want to talk about how great it is to be a digital nomad, spending time in lots of different countries while freelancing. However, it is good to be mindful that some of the people in your audience will not be able to do this because of visa issues.&lt;/li&gt;
&lt;li&gt;Sometimes you may be able to help out less privileged people. For example, if a conference accepts your talk proposal and offers to pay for your flights and hotel, but your workplace has already agreed to pay, then contact the organisers and ask them to offer your flights and hotel (and a ticket) to someone who can’t afford it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #13: colour-blindness and contrast&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For accessibility purposes, test the colours and contrast of your presentation before speaking. There are many tools for this. Here is one: &lt;a href=&quot;https://lowvisiontools.barrierbreak.com/&quot;&gt;lowvisiontools.barrierbreak.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Issue #14: distracting aspects&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be aware of and limit use of flashing, GIFs, complex or messy slides and laser pointers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These were all of the issues my group covered, although if we’d had more time, there’d definitely be more!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/inclusionary-exclusionary-language/img/groupdiscussion.jpg&quot; alt=&quot;discussing inclusionary and exclusionary language&quot; /&gt;&lt;/p&gt;
&lt;p&gt;^ group discussion :-)&lt;/p&gt;
&lt;p&gt;I hope the issues we raised seem relevant to the topic of inclusionary and exclusionary language and practices involving public speaking. Please message me with any of your comments or own ideas!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>January, Journey, Job, and Germs and Self-Care</title>
      <link href="https://amberwilson.co.uk/blog/january-journey-job-and-germs-and-self-care/"/>
      <updated>Sat, 27 Jan 2018 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/january-journey-job-and-germs-and-self-care/</id>
      <content type="html">&lt;p&gt;This post details how my January has gone so far, my reflections on it, and has an important message at the end.&lt;/p&gt;
&lt;p&gt;This January is almost over! How many of you have achieved goals you set out for yourself? And if you didn’t have goals, do you feel you’ve accomplished something good in the first month of 2018?&lt;/p&gt;
&lt;p&gt;Sometimes goals you set for yourself don’t get accomplished for one reason or another, and that’s okay. It’s probably not healthy to beat ourselves up in any way for ‘failing’ to achieve a more or less arbitrary goal that we set.&lt;/p&gt;
&lt;p&gt;As I was between jobs this month, I’d planned to spend the whole of January in coffee shops and libraries working hard at some personal web projects. This desire got put on hold practically the moment the new year fireworks began. I contracted a cold.&lt;/p&gt;
&lt;p&gt;I thought ‘ah, this cold will go away in a few days, they always do, especially when I’m at work and I’m too busy to think about being ill’. However, I wasn’t at work, I was out of my routine and so I sort of lingered at home waiting to get better. Unluckily for me, the cold evolved into a really bad chest infection – I think it was pneumonia but I never found out for sure.&lt;/p&gt;
&lt;p&gt;During the infection, I rested, visited an a&amp;amp;e doctor and got myself some decongestant, but didn’t do much else really. 10 days into the new year, I finally began to feel better but was still fatigued. The bags under my eyes told that story.&lt;/p&gt;
&lt;p&gt;With around 10 days until I was due to move to Berlin so I could look for flats before beginning work in February, I couldn’t find any time to work on my projects between the logistical juggle of storing my things, packing, throwing things away, opening a new bank account, getting health insurance, finding temporary accommodation, and organising goodbyes with friends.&lt;/p&gt;
&lt;p&gt;On the 21st January, I flew to Berlin. I spent the next 3 days moving my heavy suitcase around, spending time at my new office, meeting my new work mates, going to a cool meetup, and finding a flat. It was on the 22nd that I realised I was getting ill again. This never happens, right? Getting flu or a cold, and then getting another nearly straight after?&lt;/p&gt;
&lt;p&gt;It had never happened to me, but there’s a first time for everything. To say I was gutted would be an understatement. With so much to see and discover in Berlin I was determined to double-down on this illness and recover as fast as humanely possible. I bought ginger, lemons, apples, oranges, 100% fruit juice, a re-fillable water bottle (thank goodness Berlin’s water is drinkable), and lots of other food.&lt;/p&gt;
&lt;p&gt;I slept nearly all hours of the day for the next 2 days, ingested about 5 different sources of vitamin C, took my multivitamin I’d been neglecting, and ate lots of food. I began to feel better fast. The infusion of vitamins and rest took my fatigue away. I felt like doing stuff again. I’m sure the oranges are the only reason I feel like writing this post.&lt;/p&gt;
&lt;p&gt;When I reflected on the month, and about how ill I’d been, I realised that I’d expected my first illness to go away and to be fine within days. Did I treat the illness, or myself, seriously? No! I’d expected to be fine and bounce right back on track. I got reminded of something incredibly important this month – and that’s self-care. It could be because I’ve been out of my usual routine and had lots to do, but I think a lot of people neglect this crucial thing no matter what they’re doing in life. I’ll save the ‘but this is the world we live in now’ debate for another time because I think it’s really interesting.&lt;/p&gt;
&lt;p&gt;From February onwards, I am going to make sure that, despite being in full-time work again, I’m going to treat myself kindly, sleep a lot, and eat plenty of healthy meals (something I definitely neglected the past few months). In other words, I’m going to be proactive instead of acting reactively after I’ve been pushed to breaking point. Being proactive rather than reactive is a good thing for any aspect of life – from raising kids, to staying healthy, to achieving a goal. Just don’t be so proactive about one thing that you neglect others – something I am also guilty of.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What Am I Looking For?</title>
      <link href="https://amberwilson.co.uk/blog/what-am-i-looking-for/"/>
      <updated>Wed, 06 Dec 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/what-am-i-looking-for/</id>
      <content type="html">&lt;p&gt;Equally importantly - what are you looking for?&lt;/p&gt;
&lt;p&gt;What people want is important. And that’s never truer for web developers and for the people who employ them.&lt;/p&gt;
&lt;p&gt;Hello people of the web. I am looking for a junior web developer position! Preferably in sunny Brighton by the sea 😎&lt;/p&gt;
&lt;p&gt;However, please read on even if you are not based in Brighton!&lt;/p&gt;
&lt;p&gt;As a junior developer who has just finished her first internship at a web design agency, there are many things I’ve learned.&lt;/p&gt;
&lt;p&gt;The learning process has been great. I’ve tried so many different things and been able to form ideas about what I really like doing, how I like to work and how essential it is for me and the people I work for to look out for and support each other.&lt;/p&gt;
&lt;p&gt;Over the past few weeks, I have enjoyed diving into varied and structured tasks that range from using HTML, CSS and JS all the way to PHP, content management systems (Craft CMS), and databases. Please see what I’ve been working on &lt;a href=&quot;https://github.com/ambrwlsn&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am really interested in working for a web design or development company that will be happy to help me continue learning and increasing my skills.&lt;/p&gt;
&lt;p&gt;I am equally interested in giving back to the people I work for and helping them achieve exactly what they need.&lt;/p&gt;
&lt;p&gt;I tend to like working primarily on the frontend and with the UI (especially using HTML and CSS), and am interested in working a lot with JavaScript. I am also very interested in working with back end technologies and knowing how everything hooks up.&lt;/p&gt;
&lt;p&gt;Aside from this, I really do love learning everything and putting it all into practice. Whether it is front end, back end, best practices, semantic code, SOLID principles, documentation. Everything that goes into creating a successful product while working alongside a lovely team who also love to learn and try new things.&lt;/p&gt;
&lt;p&gt;Speaking of trying new things, I would love to work somewhere that has begun to use and work with new and emerging technologies such as AI, VR and machine learning.&lt;/p&gt;
&lt;p&gt;With my experience working in and studying psychology, I can provide a very useful perspective in my approach to development and the products I work on. I value communication and wellbeing in teams really highly and always want to look for ways to improve this - whether by talking to people, reviewing how we work, and helping to keep people motivated and happy in their jobs.&lt;/p&gt;
&lt;p&gt;I love to be involved in the web development community as much as possible. From humble beginnings attending &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; as a student all the way to organising it, public speaking at three conferences (&lt;a href=&quot;https://web.material.is/2017/&quot;&gt;Material&lt;/a&gt;, &lt;a href=&quot;https://nightlybuild.io/&quot;&gt;NightlyBuild&lt;/a&gt;, and &lt;a href=&quot;https://www.bytesconf.co.uk/&quot;&gt;Bytes&lt;/a&gt;), attending and volunteering at many different conferences and events, and writing about psychology, tech and everything in between.&lt;/p&gt;
&lt;p&gt;If you are a friendly and open company on the search for a junior developer who is insatiably curious, lives to learn, and loves to try new things, please get in touch either through &lt;a href=&quot;https://twitter.com/ambrwlsn90&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;mailto:ambrwlsn90@gmail.com&quot;&gt;email&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://amberwilson.co.uk/cv&quot;&gt;my CV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Looking forward to hearing from you!&lt;/p&gt;
&lt;p&gt;Also published on &lt;a href=&quot;https://medium.com/@ambrwlsn90/what-am-i-looking-for-983a0a960bb8&quot;&gt;Medium&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Remembering Why</title>
      <link href="https://amberwilson.co.uk/blog/remembering-why/"/>
      <updated>Wed, 06 Dec 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/remembering-why/</id>
      <content type="html">&lt;p&gt;(Originally published on &lt;a href=&quot;https://superyesmore.com/remembering-why-559d1fa546b9349321c22b67545fc9b1&quot;&gt;SuperYesMore&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Your productivity is all about you.&lt;/p&gt;
&lt;p&gt;I don’t ever like to advocate for lists like “10 ways to boost your productivity today”.&lt;/p&gt;
&lt;p&gt;Productivity is personal. Everyone’s ideas about it are different. We all seek a definition of it, and when we find one that sounds sensible, we put precious energy into achieving it. However, if it’s someone else’s definition, there’s not a huge chance we will achieve it and this can leave us feeling bad.&lt;/p&gt;
&lt;p&gt;Seeking an easy answer or universal definition for something like productivity is not unusual. Encapsulating something into one definition is easy and tidy. We can move onto the next thing quickly. It’s one of our many priorities we can attend to and then cross off the list.&lt;/p&gt;
&lt;p&gt;Not only is it kind of useless to have one definition of productivity because it’s personal to each of us, but the way we feel about things is transient in nature. Emotions are fleeting, priorities get re-shuffled, things constantly change. What works for us at one point in time may not work at another.&lt;/p&gt;
&lt;p&gt;Exploring what helps to increase your productivity at any given point in time is a great opportunity to learn about yourself. One way to begin this process is to think, and really get to the root of, why you do the things you do.&lt;/p&gt;
&lt;p&gt;Before doing this, it’s really good to remember that trying to achieve a perfect level of productivity isn’t a good idea. In the increasingly competitive environments we find ourselves in, we tend to strive for perfection to try and stay ahead of everyone else. However, when we fail to meet the mark we set for ourselves, we become understandably disappointed. There is no perfect mark, there is only doing the best we can. Perfection isn’t an achievable goal, but doing our best is something much more within our control.&lt;/p&gt;
&lt;p&gt;When I wanted to increase my productivity in my job as a web developer, I thought back to what excited me about it in the past. I used to enjoy huge levels of productivity and motivation just as I was beginning my new career.&lt;/p&gt;
&lt;p&gt;I was reading articles and blog posts, watching videos, meeting more and more people in the creative community around me, enjoying connecting with them, having interesting discussions, and getting lots of advice. Part of the excitement came from everything being new. I can almost compare it to the honeymoon period at the beginning of a relationship. It was a great buzz. I also spent a lot of time outside in the job I had before being a developer, which helped me clear my mind and relax. Most importantly, it was way easier to give myself breaks from coding.&lt;/p&gt;
&lt;p&gt;These days, I work inside for at least 8 hours a day as a developer. I have less time for the things that I really enjoyed about development in the beginning. Once I reflected on this, I remembered the things that used to really excite and motivate me. I then figured out some things I could do to enjoy more productivity in my job.&lt;/p&gt;
&lt;p&gt;Three of these things are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connecting more with people at work and discussing things that interest me.&lt;/li&gt;
&lt;li&gt;Paying attention to my work-life balance - going outside more and taking more breaks!&lt;/li&gt;
&lt;li&gt;Not striving for perfection, and instead doing my best because I can always achieve that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Through reflection about what motivated me in the past, I not only learned what it takes for me to be happier and more productive at work, but also what makes me happy and productive in general. I think it&#39;s possible to apply this reflection to any part of life.&lt;/p&gt;
&lt;p&gt;Sometimes when we’re really busy and juggling a lot of things, it’s hard to remember why certain things are important. If we take time to reflect on where we used to be, where we are now and remember where we got our motivation for these things in the first place, it might help us be a bit more productive.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Public Speaking - I Did It</title>
      <link href="https://amberwilson.co.uk/blog/public-speaking-i-did-it/"/>
      <updated>Thu, 26 Oct 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/public-speaking-i-did-it/</id>
      <content type="html">&lt;p&gt;Originally published here: &lt;a href=&quot;http://weareupfront.com/2017/10/20/upfront-conversation-amber-wilson/&quot;&gt;#upfront conversation with Amber Wilson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A couple of months ago, I arrived in Iceland to do my first conference talk and I want to share that journey with you.&lt;/p&gt;
&lt;p&gt;A year ago, with years of psychology study and experience under my belt, I moved to Brighton to begin my path towards becoming a psychologist. Soon after, I tried out my first codebar meeting because I’ve always secretly been interested in Web development. On that first evening, I met some of the organisers – three incredible, confident and successful women – &lt;a href=&quot;http://www.lottejackson.com/&quot;&gt;Charlotte Jackson&lt;/a&gt;, &lt;a href=&quot;http://www.rosaemeraldfox.com/&quot;&gt;Rosa Fox&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/notthepoint&quot;&gt;Dorothy Wingrove&lt;/a&gt;. I was in awe of them. I remember thinking ‘Wow, how are these women so calm, so confident, and so accomplished?’ It wasn’t very hard to make the decision to go back.&lt;/p&gt;
&lt;p&gt;Every single Tuesday after, I went to learn to code and hang out with the fantastic organisers and coaches. One of the evenings, I had a chance meeting with my future mentor, &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy Keith&lt;/a&gt;. I impressed him with my enthusiasm! I was lucky to meet even more people through him – one of whom, &lt;a href=&quot;https://jkphl.is/&quot;&gt;Joschi Kuphal&lt;/a&gt;, had heard that I’d studied and worked in psychology for years. Six months ago, he asked me if I’d like to speak at a brand new conference he was running in Iceland with a friend – one called &lt;a href=&quot;https://web.material.is/2017/&quot;&gt;Material&lt;/a&gt; that looks at what other disciplines can bring to Web development. I agreed right away because it sounded so exciting. The chance to go to a beautiful country, share what I’m passionate about, hear great speakers, meet interesting people, and help pioneer a cool new event? Yes, please!&lt;/p&gt;
&lt;p&gt;I had six whole months to prepare, had great support from the people around me (especially my mentor), and I knew I could speak passionately about psychology – a subject I love. So, I rationalised I’d be okay!&lt;/p&gt;
&lt;p&gt;I knew deep down, though, that I was woefully unprepared to get up and speak for half an hour in front of a large, expectant, intelligent crowd.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/public-speaking-i-did-it/img/Talk.jpg&quot; alt=&quot;Amber speaking in Iceland&quot; /&gt;&lt;/p&gt;
&lt;p&gt;‘Not only had I not written such a long talk before, but I absolutely hated speaking in front of people – it wasn’t something that came naturally to me at all. In fact, I’d find any way to avoid it whenever I could.’&lt;/p&gt;
&lt;p&gt;However, I do love a good challenge, and I always jump at chances to improve myself. Right away, I set to work on getting as much public speaking experience as possible. I joined a lovely, friendly &lt;a href=&quot;http://brightonandhovespeakersclub.com/&quot;&gt;Toastmasters&lt;/a&gt; club (where I found another brilliant mentor, &lt;a href=&quot;http://www.edgecon.co.uk/&quot;&gt;Pat Young&lt;/a&gt;), attended a few public speaking workshops and practised my talk in front of people at every opportunity.&lt;/p&gt;
&lt;p&gt;I heard tonnes of inspirational people speaking, either at conferences or online – I attended conferences such as &lt;a href=&quot;https://beyondtellerrand.com/&quot;&gt;Beyond Tellerrand&lt;/a&gt;, &lt;a href=&quot;https://2018.uxlondon.com/&quot;&gt;UX London&lt;/a&gt;, and &lt;a href=&quot;https://patternsday.com/&quot;&gt;Patterns Day&lt;/a&gt;. I watched lots of Ted Talks and Toastmasters speakers online and tried to analyse their speaking styles. I read books on public speaking – including &lt;a href=&quot;http://www.carminegallo.com/books/talk-like-ted/&quot;&gt;‘Talk Like TED’&lt;/a&gt; (a book about how Ted speakers are able to give such good talks) by Carmine Gallo, &lt;a href=&quot;https://www.pearson.com/us/higher-education/product/Unger-Speaker-Camp-A-Self-paced-Workshop-for-Planning-Pitching-Preparing-and-Presenting-at-Conferences/9780133551648.html&quot;&gt;‘Speaker Camp’&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/russunger?lang=en&quot;&gt;Russ Unger&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/samanthastarmer?lang=en&quot;&gt;Samantha Starmer&lt;/a&gt;, and &lt;a href=&quot;http://larahogan.me/speaking/&quot;&gt;‘Demystifying Public Speaking’&lt;/a&gt; by &lt;a href=&quot;http://larahogan.me/&quot;&gt;Lara Hogan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I began to ask everyone I could what their number one public speaking tip was, wrote them all down, and was surprised to see that everyone said something different.&lt;/p&gt;
&lt;p&gt;Some of the tips include smiling, not saying ‘I think I can do it’ but ‘I CAN do it’, owning it, not saying sorry if you mess up, PAUSING, etc.&lt;/p&gt;
&lt;p&gt;I got warm advice and thoughtful feedback from the people who wanted me to succeed – which was everyone.&lt;/p&gt;
&lt;p&gt;This is another tip to remember: everyone wants you to succeed – they are all on your side.&lt;/p&gt;
&lt;p&gt;I spent countless hours taking in their feedback and altering my talk, practising it again in front of people, and altering it again. In the weeks before the conference, I began to feel so calm and confident speaking in front of people – whether they were big or small groups, full of people I knew, or full of people I didn’t know. A few months before, I was a nervous wreck speaking in front of anyone. I’d experience the familiar adrenaline rush, butterflies, and shallow breathing and would sweat, shake and clam up.&lt;/p&gt;
&lt;p&gt;The day of the conference finally arrived. I’d been preparing for so long that it almost felt just like any other day. I stood up on stage, gave my talk – and… aced it! I was confident, spoke clearly, kept a great rhythm, and people congratulated me afterwards. I inspired the people in the audience! I helped make the experience worthwhile and thought-provoking for them.&lt;/p&gt;
&lt;p&gt;Would I say to other women: ‘You can do it?’ Yes, yes, and yes. You can get up there on stage and share your ideas. In fact, you absolutely should, because you have so many amazing things to offer.&lt;/p&gt;
&lt;p&gt;I think it’s extremely sad when women shy away from the stage because they think nobody can learn something from them, or nobody will listen to them, or they’d rather be pushed off the top of a building than speak in front of people.&lt;/p&gt;
&lt;p&gt;I am living proof that with some focus on practising your skills, you can completely turn yourself from super-scared to super-speaker in a few months! All the advice, all the support from mentors and friends, all the practice, all the hard work, all the feedback, all the reading, all the getting out of your comfort zone, it all works.&lt;/p&gt;
&lt;p&gt;I’ve never used the term miracle to describe anything before, but this is exactly how I describe what happened to me. I improved so much in such a short time, it feels like it simply can’t be real. But, it is real and I am reaping the benefits, as well as managing to inspire other people in the process.&lt;/p&gt;
&lt;p&gt;I am showing women that we can be up there, that we are important in this industry. I really can’t wait to do more things like this. And, I’ve been challenged to wear heels next time I do a talk. I think I will do that. Challenging myself has been a wonderful exercise so far – why not see if this is the case in the future too.&lt;/p&gt;
&lt;p&gt;If you are currently trying to think of potential topics for conferences and you’re stuck, try a small exercise. Write down the things you are most passionate about. Great speakers are always passionate about their topic, and this shows on stage (it also shows if they have little interest in it). I love psychology and the Web. My passion was with me from my initial ideas through to getting up on stage to talk.&lt;/p&gt;
&lt;p&gt;I’m based in Brighton and would love to meet you if you want some more tips on public speaking, if you are working on a talk, or if you have ideas you’d like to make a reality! Let’s get your voice heard!&lt;/p&gt;
&lt;p&gt;I’m itching for my next conference invitation so if you’d like a speaker to talk about psychology, tech or anything in between please do get in touch with me on twitter &lt;a href=&quot;https://twitter.com/ambrwlsn90?lang=en&quot;&gt;@ambrwlsn90&lt;/a&gt; or email me at &lt;a href=&quot;mailto:ambrwlsn90@gmail.com&quot;&gt;ambrwlsn90@gmail.com!&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>JPG? PNG? SVG?</title>
      <link href="https://amberwilson.co.uk/blog/jpg-png-svg/"/>
      <updated>Mon, 25 Sep 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/jpg-png-svg/</id>
      <content type="html">&lt;p&gt;There is a room that contains all there is to know about images. The door to it is locked. Most of us have casually peered through its keyhole or witnessed light of various colours and brightness spilling from it. If you are granted a guest pass to the room, beware. Akin to JK Rowling’s Triwizard Maze, you are likely to get lost in its twisting passages, or be usurped by something surprising along the way.&lt;/p&gt;
&lt;p&gt;Most of us know that when building stuff for the web, optimising HTML, CSS, JavaScript or whatever else is good – but if you don’t optimise images, all other efforts will be in vain.&lt;/p&gt;
&lt;p&gt;I’ve always been in love with pictures but knew little of the technical details behind them. Now I realise there are more of these details than you or I would ever have expected.&lt;/p&gt;
&lt;p&gt;This article barely scratches the surface of web image choice. Beyond its scope (to name but a few) are things like the maths behind image formats, GIFs, TIFFs, BMPs, use of fallback images, dots per inch, the webP image format, decreasing image requests, image metadata, image scaling, browser rendering differences, automated optimisation tools, saving for the web, sprites, lazy-loading, the picture element, srcset, re-use of images throughout a site, etc.&lt;/p&gt;
&lt;p&gt;Here are a few questions to ask yourself that may help you plot a basic map of one tiny corner of the image room – whether to use PNG, JPG or SVG image formats. Of course, as usual, it depends, and you may not get it perfect but you can, and should, damn well try! ;)&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;how-many-colours-do-i-need%3F&quot;&gt;How many colours do I need?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/jpg-png-svg/#how-many-colours-do-i-need%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled How many colours do I need?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;PNG-8 limits you to 256 colours, which is enough most of the time, has by far the smallest file size, but may exhibit “banding” of colours. If you need more colours or want to avoid banding, consider PNG 24 or 32, but be aware of huge increases in file size. JPGs can contain millions of colours and have much smaller file sizes, but are best for photos where there are no crisp lines or text. For pictures with crisp lines or text (e.g. a graph), stick with PNG and compromise on the number of colours you use. Replace PNG with SVG for simple line drawings, logos and icons.&lt;/p&gt;
&lt;p&gt;Bonus fact: the way PNGs are structured means two near-identical files that are separated only by a size difference of a few pixels may differ dramatically in size.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;do-i-need-transparency%3F&quot;&gt;Do I need transparency?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/jpg-png-svg/#do-i-need-transparency%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Do I need transparency?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;JPGs don’t offer this (although some people came up with clever hacks to merge SVG with JPG to make a transparent JPG - see &lt;a href=&quot;https://css-tricks.com/transparent-jpg-svg/&quot;&gt;here&lt;/a&gt;). PNGs and SVGs support transparency. PNG-24 will likely give better quality than PNG-8, tempting you to create a large file. SVGs are transparent by default and can be a lot smaller.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;do-i-need-the-whole-image-to-be-sharp%3F&quot;&gt;Do I need the whole image to be sharp?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/jpg-png-svg/#do-i-need-the-whole-image-to-be-sharp%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled Do I need the whole image to be sharp?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;JPGs are lossy meaning they lose quality when compressed or saved, plus they are raster-based meaning they don’t scale well. They are best used for more complex photos that have many colours - not illustrations, logos, web comics etc., where sharpness of every line is important. Another good thing is that you can selectively blur parts of a JPG, leaving more important parts sharp, but shaving more of the file size off. PNGs are lossless, so don’t lose quality when compressed or saved. This makes them a good alternative to JPG when you need crisp lines or text. However, they can be large in size and are also raster-based so won’t scale well. SVGs are vector-based and scale incredibly well, remaining sharp at any size, but aren’t suited to photos or more complex graphics.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;what-devices-do-i-need-to-optimise-for%3F&quot;&gt;What devices do I need to optimise for?
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/jpg-png-svg/#what-devices-do-i-need-to-optimise-for%3F&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled What devices do I need to optimise for?&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;On retina screens, JPGs rarely look good and PNGs have trouble scaling. SVGs look good and will scale. Support for JPG, PNG and SVG is good across all browsers, and there are work-arounds available for older browsers (e.g. IE6 to IE10). There are ways to provide back-up images to help browsers choose which format and size of image to render, depending on screen size and resolution - but these deserve their own dedicated article.&lt;/p&gt;

      &lt;div class=&quot;heading-wrapper&quot;&gt;
        &lt;h2 id=&quot;tl%3Bdr&quot;&gt;TL;DR
      &lt;/h2&gt;
        &lt;a class=&quot;anchor-link&quot; href=&quot;https://amberwilson.co.uk/blog/jpg-png-svg/#tl%3Bdr&quot;&gt;
          &lt;span class=&quot;anchor-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
    &lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot; fill=&quot;currentcolor&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;&lt;/span&gt;
          &lt;span class=&quot;hidden&quot;&gt;Section titled TL;DR&lt;/span&gt;
        &lt;/a&gt;
      &lt;/div&gt;&lt;p&gt;&lt;strong&gt;JPG&lt;/strong&gt; – lossy and raster-based, use for photos and images with loads of colours where crisp lines aren’t absolutely essential. They won’t support transparency, although there are ways around this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PNG&lt;/strong&gt; – lossless and raster-based, use for images that need crisp lines or text (but do not need to scale), need transparency, have few colours. There are PNG8, 24 and 32 – research the best to use for your specific case (see &lt;a href=&quot;http://www.patrickhansen.com/2011/02/04/png-8-24-32-what/&quot;&gt;this&lt;/a&gt; great article)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SVG&lt;/strong&gt; – vector-based, use for flat line drawings, icons, logos that’ll scale to any size while file size remains small.&lt;/p&gt;
&lt;p&gt;For some &lt;em&gt;heavy&lt;/em&gt; reading on JPG and PNG science, click &lt;a href=&quot;https://medium.freecodecamp.org/how-jpg-works-a4dbd2316f35&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://medium.com/@duhroach/how-png-works-f1174e3cc7b7&quot;&gt;here&lt;/a&gt;. These articles blew my mind!&lt;/p&gt;
&lt;p&gt;Choosing image format is only one step towards optimising images on the web. There are many, many other steps to consider, and so, so much to learn! I hope you feel brave enough to explore more corners of the image room – it’s courageous people like you who will pave the way for the excellent web experiences of the future ;)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Nightlybuild 2017</title>
      <link href="https://amberwilson.co.uk/blog/nightlybuild2017/"/>
      <updated>Wed, 06 Sep 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/nightlybuild2017/</id>
      <content type="html">&lt;p&gt;Darkness. A good kind. The theatre dressed in purple and black hues. The theme colours. Quite empty at first, smattered with only a few people. Organisers, speakers and sponsors. Everyone calm and confident, or maybe hiding nerves well. Time moved fast. The seats, around 200, seemed to fill at the blink of an eye.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stefan Judis spoke. His passion for web accessibility is uplifting. His ideas mean something, but don’t register as relevant to everyone. He is future-focused. He has smoothly conquered the human urge for immediate results. No easy feat and one that deserves respect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jana Beck spoke. Ideas are the possession of many. Making them real is hard. She does it. She takes ideas from start to finish. Incredibly well. Far beyond my abilities (for now). Her skills both perplex and delight me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spoke. Exhilarating and fun. Nerves not there. Audience seemed tiny. Learned things I couldn’t have any other way. Not from reading, talking to or even watching others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aminata Sidibe spoke. She’s foreseen something. Something wide-reaching. Matters to all of us. Personal fulfillment and happiness. A basic human right? Seems not. Society and individuals are only as strong as the weakest of us all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Natalie Pistunovich spoke. Eye-opening barely describes it. We ignore the world. Our field of vision heavily blurred. Crystal-clear vision exists in story books. Her calm confidence drew me in. She laid out clear points. They’ll stick with me. In all the work I do. Some perspectives change people. Hers changed me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank yous. Lights on. The seats empty in half a blink. What now? Some chatting. Some beer. Then it’s over.&lt;/p&gt;
&lt;p&gt;Quality over quantity. Coming together is what we need. Inspiration plus connection plus perspectives equals sparks. A flicker of light that ignites, fueling confidence and passion for what we do. The massive energy put into a conference sits, invisible, in every corner. Each attendee gets a little bit of it. Then they go out to spread it across the world.&lt;/p&gt;
&lt;p&gt;See Nightlybuild 2017 &lt;a href=&quot;https://nightlybuild.io/&quot;&gt;site&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>3 Months Vegan</title>
      <link href="https://amberwilson.co.uk/blog/3-months-vegan/"/>
      <updated>Tue, 05 Sep 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/3-months-vegan/</id>
      <content type="html">&lt;p&gt;I watched the documentary “What the Earth” three months ago and became vegan the very next day – totally cold turkey – no meat, no milk, no cheese, no eggs, no honey…&lt;/p&gt;
&lt;p&gt;Over the years I’ve spent time thinking about what the actual characteristics of meat and milk are (saturated fat and/or not actually designed for consumption by humans), and I’ve been wondering why we consume these things at all. Once I also saw how poor in quality meat and milk are most of the time (hormones, massive amounts of processing, shocking care of the poor animals), I began to scratch my head even more. The kicker was watching this documentary and being reminded once again how meat and milk industries are really, gigantic corporations who want profits and won’t stop at harming animals, people or the environment to get them. They’ll bribe, lie, use force, shirk responsibilities like animal welfare, environmental regulations, and quality control, and generally be pretty sneaky.&lt;/p&gt;
&lt;p&gt;I know and feel the steel-rod-strong cultural ties that people have to these types of foods. I was myself brought up on a diet of cheap meats like fish fingers, turkey drumsticks, mince, hotdogs, ham, and more. I also began to drink my daily cup of fresh milk at school at four years old. Milk was always pushed as the essential liquid for bone health, and also general health. I think meat and milk are so ingrained in our daily lives that people take them for granted, barely questioning their consumption.&lt;/p&gt;
&lt;p&gt;On the subject of consumption, since becoming vegan, I’ve felt my food choices sometimes limited and sometimes quite fruitful (pardon the pun). It depends where I go. I’ve consumed a lot of hummus, fruit juice, plus slightly more bread and pasta. I definitely need to learn some recipes that contain a lot more vegetables. On the plus side, I often get a break from carb-heavy stuff by happening across the odd vegan gem on a supermarket or café shelf. So, at the moment I’m eating more carbs and fat, but also more vegetables than I was before. I can’t quite tell if this is a good balance.&lt;/p&gt;
&lt;p&gt;Many things I learned since becoming a vegan fall under the category of ‘you don’t know what you don’t know’ – meaning that if I hadn’t become vegan, I wouldn’t have experienced them and they’d be out of my awareness completely. I’m glad I have them there now. I found out how bad palm oil is and how different countries (i.e. UK v.s. Germany) give different levels of fucks about how much of it they stuff into their products for unassuming consumers. Germany won on the level of fuck-giving here. Thank you Germany. I was pleasantly surprised to receive far less eye-rolls (that’s not a food), head-shakes, and awkward smiles than I’d expected when I explained to people I’d become a vegan. Even my meat-loving family and friends. People have been very accommodating and kind about it all, which I massively appreciate. I learned how many different types of milk alternatives there are. I heard from some people vegan cheese is actually really good. I learned that some people don’t know what vegans can and can’t eat. Even people who work at restaurants with vegan food advertised on the window. I found out that most dark chocolate is vegan. I learned that someone who rarely drinks milk can now detect even tiny amounts in food, and that when I sniffed some shortbread the other day (a food I used to like), it smelt like rotten milk.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Newbie Dev Tips</title>
      <link href="https://amberwilson.co.uk/blog/newbie-dev-tips/"/>
      <updated>Tue, 29 Aug 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/newbie-dev-tips/</id>
      <content type="html">&lt;p&gt;I coached a new codebar student on HTML tonight. As she and I made our websites on owls, many tips for new developers popped into my head - in the order you see below!&lt;/p&gt;
&lt;p&gt;Let me know your thoughts ❤&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Developer tools&lt;/strong&gt; - &lt;q&gt;Developers use this every single day...it&#39;s awesome and super helpful, and smart devs know how to utilise it!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text editor&lt;/strong&gt; - &lt;q&gt;Every dev has their fave one...they have tonnes of downloadable extras to help you create the perfect development playground!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Github&lt;/strong&gt; - &lt;q&gt;version control, collaboration with other devs, and code sharing... so many great projects and people!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open source&lt;/strong&gt; - &lt;q&gt;Shared projects, diverse inputs, inspirational outputs... the spirit that makes the Web great!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt; - &lt;q&gt;A developer&#39;s encyclopedia... a good dev will spend time every day searching online for the best answers!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readable code&lt;/strong&gt; - &lt;q&gt;Writing code and commenting for other devs in your team to read... hugely important for a happy developer environment!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML = structure, CSS = style&lt;/strong&gt; - &lt;q&gt;Very important to keep in mind... see CSS Zen Garden for the best depiction of this!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devs aren&#39;t perfect&lt;/strong&gt; - &lt;q&gt;Even the super-super smart ones... everyone has gaps in their knowledge, and there are definitely things you can teach them too!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking&lt;/strong&gt; - &lt;q&gt;meetups, workshops, pair-programming, clubs, events... doesn&#39;t matter where, but it matters that you do it (good things happen)!&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt; - &lt;q&gt;This is key to enjoying development work... learn, create, share, repeat!&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>Pictures, Psychology and Piano</title>
      <link href="https://amberwilson.co.uk/blog/pictures-psychology-piano/"/>
      <updated>Fri, 18 Aug 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/pictures-psychology-piano/</id>
      <content type="html">&lt;p&gt;Five days ago, I gave my first speech at &lt;a href=&quot;http://brightonandhovespeakersclub.com/&quot;&gt;Toastmasters&lt;/a&gt; - the first out of ten outlined in the official manual.&lt;/p&gt;
&lt;p&gt;It’s 4–6 minutes long and designed to be all about the speaker  — it’s called &lt;em&gt;The Icebreaker&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Due to being busy with a conference speech, I was only able to speed-write this 2 days before giving it.&lt;/p&gt;
&lt;p&gt;Nevertheless, thanks to the &lt;strong&gt;brilliant&lt;/strong&gt; people who&#39;d helped me practice my larger speech, I delivered this one fantastically!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/pictures-psychology-piano/img/best-speaker.jpg&quot; alt=&quot;best speaker award&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Out of 4 speakers, the audience voted mine the best.&lt;/p&gt;
&lt;p&gt;I think they were pleasantly surprised at how far I&#39;d come since I started to attend Toastmasters as a guest a few months ago. Not &lt;em&gt;nearly&lt;/em&gt; as surprised as I am though.&lt;/p&gt;
&lt;p&gt;Here is my speech:&lt;/p&gt;
&lt;p&gt;Pictures, Psychology and Piano&lt;/p&gt;
&lt;p&gt;We all have a past, present, and future. This is something universal between all of us. We commonly tell other people about these things using stories. I thought up a little story to describe my past, present and future.&lt;/p&gt;
&lt;p&gt;In my past, I spent a lot of time admiring pictures. Perhaps this love of pictures came from my mother. Always modest and humble, it was difficult to get my mother to admit she was good at anything. Although that didn’t stop her cheeks from glowing when you talked about her many skills. One of these skills was drawing. She doodled on napkins, scribbled on corners of paper while on the telephone, crafted beautiful greeting cards for family. When I was a baby, she painted lifelike cartoon characters on my bedroom wall. Every photo she took, she would print, date and organise neatly into labelled boxes. All of this meant that pictures were a natural part of my life. I drew my own pictures – portraits of friends, of animals and cityscapes. I took my own pictures, thousands of them. I spent hours editing them, posting them online and putting them on my wall. Additionally, I spent a lot of time admiring the drawings, photos and designs of others. They communicated things to me – ideas, stories, emotions. They connected me with what it is to be human and I loved that.&lt;/p&gt;
&lt;p&gt;In my present, I use a lot of psychology. Although, I can actually count psychology as part of my past too, as I’ve been immersed in it for nearly 10 years now. Why so long? Well, it seemed like a natural thing to study for me. And I think this was partly down to pictures. They had fostered in me a fascination about the things that connect us – about ideas, stories and emotions. I studied a lot, then I worked lot, and then I studied again – this time getting my Master’s in Child Psychology. I’d known for a while that I would love to work with children, but it took me some time to figure out why this was. I thought about it and came up with the best explanation I could. I knew that childhood is the time we first begin to connect with others, figure out our emotions, and learn how we fit in the world. I remember it being a magical time of discovery for me – beginning with my Mum and her way with pictures, progressing through to me finding my own way with them, which opened up the joy of sharing and connecting with others –pause-. I became passionate about uncovering as many ways as I could to help children learn how to connect with others. I want every child to experience the magic of doing this – to help them discover the power of ideas, the delights of stories and the nuances of emotions.&lt;/p&gt;
&lt;p&gt;In my future, I’d like to continue learning about the many ways to bring people closer together. I don’t actually work in the field of psychology any more – I work a Web developer. But, the world of Web development has so much psychology in it. It basically consists of a bunch of humans communicating with humans in order to make things for humans –pause- I haven’t talked about the last thing in my talk title tonight – pianos. I put piano in the title partly because it begins with ‘P’, which gives the title some nice alliteration, but also because the piano is something I’d really like to learn. After all, music is at least one other way to communicate.&lt;/p&gt;
&lt;p&gt;So, I’ve talked to you about my past, present and future. It was one story. I could’ve crafted any number of stories about these things. And, this is something I might try. Each would be a piece of me I could keep forever. I encourage you to try it.&lt;/p&gt;
&lt;p&gt;Also published on &lt;a href=&quot;https://medium.com/@ambrwlsn90/pictures-psychology-and-piano-a2a5e986b924&quot;&gt;Medium&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Material Conference</title>
      <link href="https://amberwilson.co.uk/blog/material-conference/"/>
      <updated>Fri, 18 Aug 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/material-conference/</id>
      <content type="html">&lt;p&gt;Where do I start? The preconceptions I had about the experience were inaccurate. I thought it’d be an absolutely great day – a day full of learning about the Web, meeting cool people, and achieving my first big talk. Those things turned out to be included for sure. The thing is though... it was also so much more.&lt;/p&gt;
&lt;p&gt;There’s an element of magic in the air that you get to grasp and breathe in when you gather in the same place with so many different people – people with stories and paths they could write books about. The passion, the ideas, the stories of difficult journeys (the behind-the-scenes that you never see on social media). All of this makes not a basic recipe for a good time, but one for a delicious, enlightening experience that I’ve not seen replicated in any other environment.&lt;/p&gt;
&lt;p&gt;The hall was oddly calming – the carefully thought-out architecture making me feel peaceful. The podium was there, I checked my computer and everything worked fine from the start. I felt the tiniest pang of nervousness, but no more.&lt;/p&gt;
&lt;p&gt;We started just a few minutes after 9am with a talk by &lt;a href=&quot;http://www.solidwool.com/&quot;&gt;Solidwool&lt;/a&gt; that taught me things I hadn’t expected to learn and won’t ever forget. Then the chocolate talk by &lt;a href=&quot;https://www.omnomchocolate.com/&quot;&gt;OmNom&lt;/a&gt; – listening to the inner workings and philosophies of an upcoming, innovative brand of chocolate made in the heart of Reykjavik. I tried some of it and said I wished they’d always keep experimenting. Then it was my turn. I stood up on stage. I managed to smile. I gave my talk with as much passion as I could and hoped people felt that. Once I sat down, several people congratulated me, and more did throughout the day. The mini talk by &lt;a href=&quot;http://halldor.eldjarn.is/&quot;&gt;Halldór&lt;/a&gt; was mesmerising. He achieves something incredible - pairing music and technology – a synthesis that can create original mixtures of sounds nobody has ever heard before. Next was a fantastic talk by Icelandic designer &lt;a href=&quot;http://cargocollective.com/goddur&quot;&gt;Goddur&lt;/a&gt;, master of his craft, who knows his material so well that he spoke with little or no prep and plenty of tonal variety in the right places (something I want to work on).&lt;/p&gt;
&lt;p&gt;Lunch time was tasty, intriguing and culturally satisfying. We ate great food, talked in depth on a few topics, and enjoyed a hugely thought-provoking art gallery. After lunch was &lt;a href=&quot;http://www.bbc.co.uk/rd/people/tristan-ferne&quot;&gt;Tristan&lt;/a&gt; from the BBC talking about storytelling and the many different ways you can do this. This was very exciting to me. Then was &lt;a href=&quot;http://flow.is/&quot;&gt;Tristan&lt;/a&gt;, who also had little or no preparation, pouring forth her passion for Icelandic nature, meditation, and how she’s combining this with an exciting, up-and-coming technology. Even her voice made me feel I was meditating. I tried her VR headset and meditation program. I felt instantly calmed. After coffee, we heard from Dan who talked about remembering people in design – something overlooked but crucial. Then we heard &lt;a href=&quot;https://twitter.com/TommyStadlen&quot;&gt;Tommy&lt;/a&gt; who talked about Polaroid and going back to the physical, to what makes us feel all warm and fuzzy. I never knew vinyl sales was a billion-dollar industry now.&lt;/p&gt;
&lt;p&gt;This conference was unusual. The speakers all so different. The &lt;a href=&quot;http://nordichouse.is/en/&quot;&gt;location&lt;/a&gt; unique. How &lt;em&gt;could&lt;/em&gt; my preconceptions have been accurate? They couldn&#39;t have been. I found though, that when you have little idea of what’s coming, you’re able to be so much more immersed in it. Something sparks, then clicks, then you see magic unfold before you. I gained a truly meaningful experience – one that I am immeasurably glad to have been a part of. &lt;a href=&quot;https://jkphl.is/&quot;&gt;Joschi&lt;/a&gt; and &lt;a href=&quot;http://suda.co.uk/&quot;&gt;Brian&lt;/a&gt; – thank you for taking this conference from idea to reality and bringing us all together for such a special time. I have no doubt that people walked away invigorated and full of ideas about looking at different materials and how they can inform the Web. I can’t wait for the next one. I urge anyone to go - but make sure to make some room in your brain first. You&#39;re gonna need it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/material-conference/img/material2.jpg&quot; alt=&quot;Conference stage&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/material-conference/img/material4.jpg&quot; alt=&quot;Conference audience&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/material-conference/img/material1.jpg&quot; alt=&quot;Me speaking on stage&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/material-conference/img/material3.jpg&quot; alt=&quot;Reykjavik&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Also published on &lt;a href=&quot;https://medium.com/@ambrwlsn90/material-conference-6e9342f5eada&quot;&gt;Medium&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What I Learned Today</title>
      <link href="https://amberwilson.co.uk/blog/wilt22june/"/>
      <updated>Thu, 22 Jun 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/wilt22june/</id>
      <content type="html">&lt;p&gt;Today I sat with Russell Ward, technical director at &lt;a href=&quot;https://www.theunit.co.uk/&quot;&gt;The Unit&lt;/a&gt;. We talked about how I can get involved in the development team as part of my internship. This quickly turned into a discussion about programming languages and the Web.&lt;/p&gt;
&lt;p&gt;I was introduced to a lot of topics, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SOLID principles - see &lt;a href=&quot;https://www.youtube.com/watch?v=GtZtQ2VFweA&quot;&gt;video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1KB challenge - see &lt;a href=&quot;https://hackaday.io/project/19033-1k-lcd-tinyfont&quot;&gt;example&lt;/a&gt; project&lt;/li&gt;
&lt;li&gt;Domain-driven design theory&lt;/li&gt;
&lt;li&gt;Functional, procedural, and object oriented programming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Throughout, Russell explained how he got into programming and what he enjoys about it. He likes to solve problems but also likes pulling problems apart and figuring out why they exist in the first place. It may be an issue today that new developers only do the former.&lt;/p&gt;
&lt;p&gt;I explained the premise of my upcoming conference talk I&#39;ll be doing in Iceland at &lt;a href=&quot;https://web.material.is/2017/&quot;&gt;Material&lt;/a&gt; and in Cologne at &lt;a href=&quot;https://nightlybuild.io/&quot;&gt;Nightly Build&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;I want to give people some inspiration to look back on where the Web came from, and get insight into what another discipline is doing. Other professions may have hundreds of years behind them - the Web is barely a quarter of a century old, yet most of its technologies are already outdated. What insights could we gain from architects, psychologists, engineers? Many established Web developers have grown up with and spent many years immersed in technology and therefore know its history and have a solid intuition about Web development. However, most new developers have almost no clue about how Web development got to where it is today. They are woodworkers with no idea of how the wood was grown, how heavy it is, or how to build something sturdy from it.&lt;/blockquote&gt;
&lt;p&gt;Russell explained how many new developers got into Web development for different reasons to more seasoned developers. In the past, to learn programming languages, it was a necessity to be motivated and focused. There were no university courses, bootcamps, video tutorials, CDs, or coding meetups. You learned through typing code, solving novel problems, and finding the smartest person you could in the hopes they&#39;d mentor you. You learned what worked, what didn&#39;t and why. Today, there are still ways to learn programming in creative ways, but there are also other, faster routes that don&#39;t give so much of a solid, theoretical grounding.&lt;/p&gt;
&lt;p&gt;I asked Russell if he thought mentorships or apprenticeships are a good idea. He explained that he has found various mentors over the years to be extremely helpful. Even the blunt, grumpy ones taught him a lot. I got the impression that Web development as a profession is no different to that of any other - it&#39;s best to learn it from the &#39;masters&#39; - those who have been around long enough to have a grip on why things are done the way they are. I think it can help get people excited about solving problems in new and creative ways, which can only be good for the Web.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Public Speaking Workshop</title>
      <link href="https://amberwilson.co.uk/blog/publicspeakingworkshop/"/>
      <updated>Thu, 15 Jun 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/publicspeakingworkshop/</id>
      <content type="html">&lt;p&gt;Earlier this week I attended a public speaking workshop run by &lt;a href=&quot;https://www.improvisingchange.co.uk/&quot;&gt;Matt Matheson&lt;/a&gt;. There were ten people in the group. We wrote stories. We played games. We presented. One hour in we had already talked in front of everyone four times. The lovely thing is – everyone did really well. We were all praised and given immediate feedback and I learned something new each time I spoke.&lt;/p&gt;
&lt;p&gt;There was no time to sit in a corner and hide during the workshop. Had we been given that opportunity, I don’t think we’d have performed nearly as well. I think there is something great to having to think on your feet, be exposed, and present talks of various lengths and types. It feels like a worthwhile challenge that you take in your stride, allowing you to perform much better than you ever thought you could. I won’t go into detail about any of the exercises – the magic behind them has to be experienced in person.&lt;/p&gt;
&lt;p&gt;I learned that other people have very different concerns and fears around public speaking than I do and that some of us share the same fears. I learned a lot about the importance of positive praise - both receiving and giving it. I walked away with techniques I will be able to remember and utilise for a long time to come. I learned that everyone is a natural storyteller and that you never come across as bad a public speaker as you think you do. There is always a way to harness your passion for a topic and translate it to confidence on stage. It&#39;s absolutely worth getting out there and talking about things that mean something to you. You&#39;ll always find people who want to listen and will learn something from you.&lt;/p&gt;
&lt;p&gt;Here&#39;s just a tiny snippet of the things I learned from the brilliant attendees of the workshop under Matt’s guidance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Say “yes” to invitations to speak&lt;/li&gt;
&lt;li&gt;Integrate your facts into a story&lt;/li&gt;
&lt;li&gt;Know, engage and connect with your audience&lt;/li&gt;
&lt;li&gt;Be authentic - say the good, the bad and the ugly&lt;/li&gt;
&lt;li&gt;Appeal to the audience members’ emotions as well as their minds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&#39;d like to discover your own fantastic tips, you can get in touch with Matt &lt;a href=&quot;https://www.improvisingchange.co.uk/get-in-touch&quot;&gt;here&lt;/a&gt; to ask about workshop possibilities :)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/publicspeakingworkshop/img/publicspeaking.jpg&quot; alt=&quot;Attendees of the public speaking workshop&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Very happy workshop participants - thanks Matt for the workshop and the pic!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>URLs</title>
      <link href="https://amberwilson.co.uk/blog/urls/"/>
      <updated>Wed, 07 Jun 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/urls/</id>
      <content type="html">&lt;p&gt;Welcome to my learning process. Today I tried learning about URLs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1: Sizzling Intro (Overconfidence)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://css-tricks.com/future-front-end-web-development/&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/urls/img/killerfeature.png&quot; alt=&quot;urls are a killer feature&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;URLs are &lt;em&gt;still&lt;/em&gt; a killer feature of the Web. This is what &lt;a href=&quot;http://chriscoyier.net/&quot;&gt;Chris Coyier&lt;/a&gt; wrote recently on &lt;a href=&quot;https://css-tricks.com/&quot;&gt;CSS tricks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cool!&lt;/p&gt;
&lt;p&gt;So, URLs have stood the test of time on the Web, providing us from the very beginning with an unmanned gateway to information, ability to share things, and to &lt;em&gt;search&lt;/em&gt; (where would we be today without our trusty search engines?)&lt;/p&gt;
&lt;p&gt;URLs seem simple. You type them in and voila. There can&#39;t be much to them, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2: Lots of Confusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://danielmiessler.com/images/URI-vs.-URL-e1464829000786.png&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/urls/img/uri.png&quot; alt=&quot;URI&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://webmasters.stackexchange.com/questions/19101/what-is-the-difference-between-a-uri-and-a-url&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/urls/img/uri2.png&quot; alt=&quot;URI&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wrong. I found these. &lt;em&gt;What do they mean?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3: Craving Different Perspectives&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I learn by researching the same topic written on by different people (&lt;em&gt;btw&lt;/em&gt; this is why you should blog). I found articles on URIs/URLs/URNs, e.g. &lt;a href=&quot;https://danielmiessler.com/study/url-uri/&quot;&gt;here&lt;/a&gt;, &lt;a href=&quot;https://damnhandy.com/2009/08/26/url-vs-uri-vs-urn-in-more-concise-terms/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://prateekvjoshi.com/2014/02/22/url-vs-uri-vs-urn/&quot;&gt;here&lt;/a&gt;. I discovered lots of different, confusing terminology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4: Listening is Learning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Desperate for some understanding, I watched two videos, &lt;a href=&quot;https://www.youtube.com/watch?v=vpYct2npKD8&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=if0pzXWZOfY&quot;&gt;here&lt;/a&gt;. I discovered simpler explanations and handy diagrams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5: Drawing Pretty Pictures&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I want to convey simply what a URL (and URI/URN) is. This inspired me to draw!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6: &lt;strong&gt;URL&lt;/strong&gt;y Like This&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://amberwilson.co.uk/blog/urls/img/URL.svg&quot;&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/urls/img/URL.svg&quot; alt=&quot;SVG diagram&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This pic contains all parts of a URL I could find. Below are the (non-exhaustive) 1000 words it paints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scheme/protocol&lt;/strong&gt; - Identifies a resource and tells you how to interpret the part of the URL after the colon. Mostly http/https/&lt;a href=&quot;https://en.wikipedia.org/wiki/File_Transfer_Protocol&quot;&gt;ftp&lt;/a&gt;, but there are &lt;a href=&quot;https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml&quot;&gt;lots&lt;/a&gt; more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subdomain&lt;/strong&gt; - The default is &#39;www&#39;. Tim Berners-Lee admitted this should have been &#39;info&#39;. TBL also admitted &lt;a href=&quot;http://www.telegraph.co.uk/technology/news/6321463/Sir-Tim-Berners-Lee-admits-forward-slashes-on-World-Wide-Web-were-a-mistake.html&quot;&gt;this&lt;/a&gt; mistake.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt; - A nickname for an IP address (the string of numbers read by computers) that identifies Web pages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Second-level/top-level domain&lt;/strong&gt; - For &#39;&lt;a href=&quot;http://example.com/&quot;&gt;example.com&lt;/a&gt;&#39;, example is the second-level domain and .com is the top-level domain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Port&lt;/strong&gt; - 443 is the default port for secure web servers (https). 80 is default for http. Web servers can listen on a port specified by a user and otherwise are usually hidden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt; - The part of a URL that is &lt;a href=&quot;http://warpspire.com/posts/url-design&quot;&gt;designed&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Query string separator&lt;/strong&gt; - The &#39;?&#39; separates the query string from the other parts of the URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Query string/parameter&lt;/strong&gt; - Set dynamically with an unstandardised structure, they commonly contain the the content of an HTML form. In the picture are &#39;docid&#39; (document identifier) and &#39;hl&#39; ( &lt;a href=&quot;https://developers.google.com/custom-search/docs/xml_results?hl=en#WebSearch_Query_Parameter_Definitions&quot;&gt;host language&lt;/a&gt;) with respective values of &#39;720&#39; and &#39;en&#39;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fragment/anchor ID&lt;/strong&gt; - Refers to an internal section within a web document.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URI&lt;/strong&gt; - Uniform Resource Identifier. An entire set of directions for finding any sort of resource on the Web. Has two subsets - URLs and URNs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt; - Uniform Resource Link. Identifies but also specifies &lt;strong&gt;network location&lt;/strong&gt; of a resource. What most think of when imagining a link to a website, i.e. a Web address. &lt;strong&gt;Absolute&lt;/strong&gt; URLs (i.e. including scheme) should link to external pages/images and a &lt;strong&gt;relative&lt;/strong&gt; URLs should link to internal pages/images within your own site. &lt;a href=&quot;https://stackoverflow.com/questions/2005079/absolute-vs-relative-urls&quot;&gt;This&lt;/a&gt; helps avoid broken links when schemes or domain names change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URN&lt;/strong&gt; - Uniform Resource Name. Specifies &lt;strong&gt;name&lt;/strong&gt; of resource. Useful because they are globally unique and persistent over long periods of time, even after the resource which they identify ceases to exist or becomes unavailable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6: Examples I Found&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URN&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;urn:isbn:0451450523 - The 1968 book The Last Unicorn, identified by its book number.&lt;/li&gt;
&lt;li&gt;urn:lex:eu:council:directive:2010-03-09;2010-19-UE - A directive of the European Union, using the proposed Lex URN namespace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cascadingmedia.com/assets/images/insites/2015/02/url-anatomy/url-anatomy-55598c24.png&quot;&gt;https://cascadingmedia.com/assets/images/insites/2015/02/url-anatomy/url-anatomy-55598c24.png&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;ftp://ftp.funet.fi/pub/standards/RFC/rfc959.txt&quot;&gt;ftp://ftp.funet.fi/pub/standards/RFC/rfc959.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;URI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://example.com/resource?foo=bar#fragment&quot;&gt;http://example.com/resource?foo=bar#fragment&lt;/a&gt; (also a URL)&lt;/li&gt;
&lt;li&gt;978-0553293357 - unique identifier for a book (also a URN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;7: TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A URI identifies a resource either by location, or a name, or both. A URI has two specializations known as URL and URN.&lt;/li&gt;
&lt;li&gt;All URLs and URNs are URIs (see argument against this &lt;a href=&quot;https://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn?rq=1&quot;&gt;here&lt;/a&gt;) but not all URIs are URLs and URNs.&lt;/li&gt;
&lt;li&gt;Read my shorter, friendlier follow-up post on URLs.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>IndieWebCamp</title>
      <link href="https://amberwilson.co.uk/blog/indiewebcamp/"/>
      <updated>Tue, 23 May 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/indiewebcamp/</id>
      <content type="html">&lt;p&gt;My experience of &lt;a href=&quot;https://indieweb.org/2017/Nuremberg&quot;&gt;IndieWebCamp Nürnberg&lt;/a&gt; (check out the GIF at the end!) was complemented by &lt;a href=&quot;https://beyondtellerrand.com/events/duesseldorf-2017/speakers&quot;&gt;Beyond Tellerrand Düsseldorf&lt;/a&gt; and the &lt;a href=&quot;https://calumryan.com/learning/evaluating-technology/&quot;&gt;Evaluating Technology&lt;/a&gt; workshop by &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy Keith&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was my first time attending any of these events and each brought its own unique &lt;a href=&quot;https://amberwilson.co.uk/blog/btconf/&quot;&gt;experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The IndieWebCamp was split into two parts. On Saturday we gained inspiration from discussing different topics suggested by camp attendees. On Sunday we harnessed this inspiration and, alone or in groups, we got to work.&lt;/p&gt;
&lt;p&gt;Through the continuous but pleasant hum of tapping keys and some select songs from a German radio station, we spent many focused hours working. The scope of the work varied quite a lot. A few of us were fairly new to the Web scene (me included), and we worked on making a number of small improvements to our sites. Some more seasoned Web developers had more specific projects in mind, from working with Grav and Jekyll (CMS), to tinkering with &lt;a href=&quot;https://indieweb.org/Webmention&quot;&gt;Webmention&lt;/a&gt; formats, to improving back-end systems using Node.js. Others were working on things like personas or information sites that will help encourage more people to learn about the &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWeb&lt;/a&gt;. One attendee worked on a four-year old project involving creating decentralised social networking sites, with the ultimate goal being getting rid of Facebook.&lt;/p&gt;
&lt;p&gt;We all demoed what we&#39;d done - check these out &lt;a href=&quot;https://youtu.be/_Zub-PBHPng&quot;&gt;here&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;Personally, I worked on HTTPS, site search, file extensions, HTML/CSS tidying, redirects, and passing IndieWeb levels one and two via &lt;a href=&quot;https://indiewebify.me/&quot;&gt;indiewebify.me&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/indiewebcamp.jpg&quot; alt=&quot;what I worked on at indie web camp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://jkphl.is/&quot;&gt;Joschi&lt;/a&gt; for this &lt;a href=&quot;https://twitter.com/jkphl/status/866310997207863296&quot;&gt;shoutout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some of my takeaways from the camp were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I might not yet understand how to use the hugely varied technologies that contribute to forming the Web, but that&#39;s okay. I can and should keep asking, doing and learning.&lt;/li&gt;
&lt;li&gt;The developers at the camp were so friendly and encouraging, just like the developers I&#39;ve met in Brighton. I&#39;ve achieved so much with their help and am so happy to belong to a community of such nice people.&lt;/li&gt;
&lt;li&gt;There is a point to decentralising the Web and I&#39;m really glad to be part of the effort towards achieving this.&lt;/li&gt;
&lt;li&gt;The idea of &lt;a href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE&lt;/a&gt;ing (publishing on your own site, syndicating elsewhere) is very powerful and helps keep the Web independent as well as allowing you to own your own content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://jkphl.is/&quot;&gt;Joschi&lt;/a&gt; for inviting me and making my stay really comfortable. Thanks to &lt;a href=&quot;https://aaronparecki.com/&quot;&gt;Aaron&lt;/a&gt; for helping the camp run so smoothly alongside Joschi and Jeremy. And thanks to &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; for helping me with Web stuff.&lt;/p&gt;
&lt;p&gt;Looking forward to future IndieWebCamps - hopefully the next one will be in Brighton in September!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/tollwerk.jpg&quot; alt=&quot;tollwerk&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/nuernberg.jpg&quot; alt=&quot;nuremberg&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/calumjoschi.jpg&quot; alt=&quot;calum and joschi&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/indiewebcamp2.jpg&quot; alt=&quot;indie web camp&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/intro1.jpg&quot; alt=&quot;intro one&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/intro2.jpg&quot; alt=&quot;intro two&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/talks.jpg&quot; alt=&quot;talk topics&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/stadtpark.jpg&quot; alt=&quot;stadtpark&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/discussion_time.jpg&quot; alt=&quot;discussion&quot; /&gt; &lt;img src=&quot;https://amberwilson.co.uk/blog/indiewebcamp/img/atwork.jpg&quot; alt=&quot;at work&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Mobile First</title>
      <link href="https://amberwilson.co.uk/blog/mobilefirst/"/>
      <updated>Fri, 19 May 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/mobilefirst/</id>
      <content type="html">&lt;p&gt;Today I realised I wasn&#39;t adhering to a new, up-and-coming idea called &#39;&lt;a href=&quot;https://www.lukew.com/ff/entry.asp?933&quot;&gt;Mobile First&lt;/a&gt;&#39;...maybe you&#39;ve heard of it?&lt;/p&gt;
&lt;p&gt;Once I had written a correct media query to adhere to this interesting new idea, I noticed my site looked pretty ugly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/mobilefirst/img/site-ugly.png&quot; alt=&quot;ugly site&quot; /&gt;&lt;/p&gt;
&lt;p&gt;But still good on all screens less than 520px.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/mobilefirst/img/site-mobile.png&quot; alt=&quot;mobile site&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It is supposed to look similar on desktop.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/mobilefirst/img/site-pretty.png&quot; alt=&quot;pretty site&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I effectively had to switch my mindset around. Instead of thinking of everything inside a media query as belonging to the mobile part of my design, I had to imagine it contained the desktop design. And the place where desktop code lived before now resides within a media query. The resulting switch didn&#39;t take long to accomplish and gave me another chance to look at my CSS, and to tidy it up a little - always a good practice now and again.&lt;/p&gt;
&lt;p&gt;In any case, I can now feel proud that my site adheres to the best practice of Mobile First design.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Btconf Düsseldorf 2017</title>
      <link href="https://amberwilson.co.uk/blog/btconf/"/>
      <updated>Fri, 19 May 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/btconf/</id>
      <content type="html">&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf1-min.jpg&quot; alt=&quot;cultivating community&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf3-min.jpg&quot; alt=&quot;typography - Seb Lester&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf4-min.jpg&quot; alt=&quot;btconf day two welcome&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf5-min.jpg&quot; alt=&quot;music and comedy&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf6-min.jpg&quot; alt=&quot;tim berners-lee&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf8-min.jpg&quot; alt=&quot;btconf crowd&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf9-min.jpg&quot; alt=&quot;jeremy mansplaining&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf10-min.jpg&quot; alt=&quot;sarah jeremy jina&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf11-min.jpg&quot; alt=&quot;btconf crowd&quot; /&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/btconf/img/btconf12-min.jpg&quot; alt=&quot;btconf after party&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What can I say? My first conference experience. Many thanks to those who made it possible - especially &lt;a href=&quot;https://jkphl.is/&quot;&gt;Joschi Kuphal&lt;/a&gt;. It was such a whirlwind of knowledge, meeting new people and enjoying good food &amp;amp; beer. All the while enjoying the unxepected but intense sunshine that had appeared after weeks of cold and rain in Germany. I am keen to return again and again, most of all to reunite with the kind, funny and extremely interesting people I was so lucky to meet there.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Storytelling</title>
      <link href="https://amberwilson.co.uk/blog/storytelling/"/>
      <updated>Mon, 08 May 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/storytelling/</id>
      <content type="html">&lt;p&gt;Today I was lucky to attend a workshop on storytelling held by &lt;a href=&quot;https://www.improvisingchange.co.uk/&quot;&gt;Matt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In two short hours, we did various thought exercises, shared our tips on telling good stories, and were asked to write and tell various stories - both factual and fictional.&lt;/p&gt;
&lt;p&gt;At the end, we each explained what we&#39;d learned.&lt;/p&gt;
&lt;p&gt;My favourite take-away was that it&#39;s useful to include things in your story that are important to the people listening. This helps engage them. Some of these might be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Themselves&lt;/li&gt;
&lt;li&gt;Food&lt;/li&gt;
&lt;li&gt;The company they work for&lt;/li&gt;
&lt;li&gt;Explosions&lt;/li&gt;
&lt;li&gt;Shock, awe &amp;amp; swearing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some other things I learned about are that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;delivery&lt;/strong&gt; of a story is very important.&lt;/li&gt;
&lt;li&gt;Having a beginning, middle and end is a good strategy - the end could be a moral or a cliffhanger. Ending on a point/punchline brings clarity to listeners. Conversely, people react well to suspense and surprise.&lt;/li&gt;
&lt;li&gt;Adding intrigue, twists and revelations - topped with a satisfying ending - can keep listeners engaged.&lt;/li&gt;
&lt;li&gt;People can relate to the protagonist (hero) and antagonist (villain) structure. Having someone to care about/root for, or to dislike, is useful.&lt;/li&gt;
&lt;li&gt;Stories are innate to humans, and they make things easier to remember.&lt;/li&gt;
&lt;li&gt;What makes a good story has changed over time.&lt;/li&gt;
&lt;li&gt;Benefits include sensemaking, emotional engagement, advanced understading.&lt;/li&gt;
&lt;li&gt;Having &#39;some friction in the fiction&#39; - i.e. making people think and creating a balance of effort and reward - can keep listeners engaged.&lt;/li&gt;
&lt;li&gt;Having believable characters is important - people can smell lack of authenticity!&lt;/li&gt;
&lt;li&gt;Making stories silly/fun. A story can be what you make it. Why make it serious?&lt;/li&gt;
&lt;li&gt;Using visual analogies helps - e.g. the pile of clothes was as tall as Mt. Everest. Images are enjoyable and easy to remember.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Storytelling is an incredibly powerful tool in the web developer&#39;s arsenal. It can help us build better relationships with clients, staff, friends, and family. It can help us better understand ourselves. As a communication tool it can be used as an icebreaker and a point of reference. I think it&#39;s in the interest of anyone and everyone to practice telling stories. It is a tried and tested medium for better understanding of ourselves and others. Go tell!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>HTTPS Poem</title>
      <link href="https://amberwilson.co.uk/blog/httpspoem/"/>
      <updated>Mon, 08 May 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/httpspoem/</id>
      <content type="html"> &lt;blockquote&gt;
        &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;A little poem about HTTPS. &lt;a href=&quot;https://t.co/kTuK3Fr8Es&quot;&gt;https://t.co/kTuK3Fr8Es&lt;/a&gt;&lt;/p&gt;&amp;mdash; CSS-Tricks
        (@Real_CSS_Tricks) &lt;a href=&quot;https://twitter.com/Real_CSS_Tricks/status/863091416506839041&quot;&gt;May 12, 2017&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sending info over the Web?&lt;/p&gt;
&lt;p&gt;If yes it pays to use your head.&lt;/p&gt;
&lt;p&gt;HTTP is the protocol which&lt;/p&gt;
&lt;p&gt;Can send data at the flip of a switch.&lt;/p&gt;
&lt;p&gt;But did you think where your info’s displayed?&lt;/p&gt;
&lt;p&gt;It could get lost or might end up astray.&lt;/p&gt;
&lt;p&gt;We all like to login or buy things online.&lt;/p&gt;
&lt;p&gt;But in doing so, will our data be fine?&lt;/p&gt;
&lt;p&gt;Tricksters and thieves are watching and waiting&lt;/p&gt;
&lt;p&gt;For your info they get by locating&lt;/p&gt;
&lt;p&gt;The plaintext file containing your details.&lt;/p&gt;
&lt;p&gt;This is where HTTP alone fails.&lt;/p&gt;
&lt;p&gt;Have no fear, add an ’S’ to the end.&lt;/p&gt;
&lt;p&gt;Then attackers cannot read what you send.&lt;/p&gt;
&lt;p&gt;The ’S’ is short for ‘SSL’,&lt;/p&gt;
&lt;p&gt;Something really very swell.&lt;/p&gt;
&lt;p&gt;It helps you to encrypt your files,&lt;/p&gt;
&lt;p&gt;And does this with integrity and style.&lt;/p&gt;
&lt;p&gt;Data integrity to be exact,&lt;/p&gt;
&lt;p&gt;Authentication, confidentiality and all that.&lt;/p&gt;
&lt;p&gt;Your data is encrypted and needs the correct key&lt;/p&gt;
&lt;p&gt;To be seen and read by you and not me.&lt;/p&gt;
&lt;p&gt;To be certain SSL makes a site secure,&lt;/p&gt;
&lt;p&gt;A certificate authority helps reassure&lt;/p&gt;
&lt;p&gt;That a site is in fact the real deal&lt;/p&gt;
&lt;p&gt;And not a fake, hacker-rich ordeal.&lt;/p&gt;
&lt;p&gt;Of course SSL is not without flaw&lt;/p&gt;
&lt;p&gt;But it always evolves and won’t ever withdraw.&lt;/p&gt;
&lt;p&gt;If the information here is confusing to you,&lt;/p&gt;
&lt;p&gt;There are others who have explained this stuff too.&lt;/p&gt;
&lt;p&gt;Find some great info &lt;a href=&quot;http://robertheaton.com/2014/03/27/how-does-https-actually-work/&quot;&gt;here&lt;/a&gt;, &lt;a href=&quot;https://www.instantssl.com/ssl-certificate-products/https.html&quot;&gt;here&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security&quot;&gt;here&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;For those of you who are still quite unclear&lt;/p&gt;
&lt;p&gt;On how HTTP can add just one little letter&lt;/p&gt;
&lt;p&gt;To help make the Web securer and better.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What I Learned Today</title>
      <link href="https://amberwilson.co.uk/blog/wilt13april/"/>
      <updated>Thu, 13 Apr 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/wilt13april/</id>
      <content type="html">&lt;p&gt;At &lt;a href=&quot;https://clearleft.com/&quot;&gt;Clearleft&lt;/a&gt; today, I ran through many new (and some familiar) things with &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We talked about &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt;&#39;s upcoming event - &lt;a href=&quot;http://patternsday.com/&quot;&gt;Patterns Day&lt;/a&gt; (check out the site, it&#39;s nifty - also, buy a ticket!), to be held on June 30th. Jeremy kindly invited me along and I&#39;m really excited!&lt;/li&gt;
&lt;li&gt;I found out where &lt;a href=&quot;https://clearleft.com/&quot;&gt;Clearleft&lt;/a&gt; got their idea for the 100 day challenge - &lt;a href=&quot;https://twitter.com/aaronpk&quot;&gt;Aaron Parecki&lt;/a&gt;&#39;s &lt;a href=&quot;https://100.aaronparecki.com/&quot;&gt;100 days of music&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;I learned that these &lt;em&gt;amazing&lt;/em&gt; &lt;a href=&quot;http://www.colorfonts.wtf/&quot;&gt;color fonts&lt;/a&gt; won&#39;t be available for a while (sadly).&lt;/li&gt;
&lt;li&gt;I discovered a nice example of excellent forward-thinking. The creators of the &lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/CSS/font-weight&quot;&gt;font-weight&lt;/a&gt; CSS property use 100-700 for weighting type, not 1-7. This is because they anticipated that more values could be utilised in the future. Now they can, with &lt;a href=&quot;http://typographica.org/on-typography/variable-fonts/&quot;&gt;variable fonts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Microformats &lt;a href=&quot;http://microformats.org/wiki/existing-rel-values&quot;&gt;rel values&lt;/a&gt; (a question about these sprung up when I coached at &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; earlier in the week).&lt;/li&gt;
&lt;li&gt;HTML5 &lt;a href=&quot;https://www.w3.org/TR/html4/types.html#h-6.12&quot;&gt;link types&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;XFN - The &lt;a href=&quot;http://microformats.org/wiki/XFN&quot;&gt;HTML5 Friends Network&lt;/a&gt;. Jeremy has nice examples on his own site including rel=&amp;quot;friend&amp;quot; and rel=&amp;quot;met&amp;quot; in his &#39;bedroll&#39; section.&lt;/li&gt;
&lt;li&gt;Examining what rel=&amp;quot;canonical&amp;quot; does (it helps Google reference original publications).&lt;/li&gt;
&lt;li&gt;Twitter &lt;a href=&quot;https://cards-dev.twitter.com/validator&quot;&gt;card validators&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I completed &lt;a href=&quot;http://cssgridgarden.com/&quot;&gt;CSS Grid Garden&lt;/a&gt;. It was really fun and I like the specs a lot.&lt;/li&gt;
&lt;li&gt;Jeremy has written things about &lt;a href=&quot;https://adactio.com/links/tags/grid&quot;&gt;CSS Grid&lt;/a&gt;. We dove into discussions about &lt;a href=&quot;https://css-tricks.com/snippets/css/complete-guide-grid/&quot;&gt;Grid&lt;/a&gt;, and also &lt;a href=&quot;https://flexbox.io/&quot;&gt;Flexbox&lt;/a&gt;. I learned how Grid and Flexbox were created by the same people and share a lot of vocabulary. This means they can both be utilised in the same stylesheet to suit different purposes.&lt;/li&gt;
&lt;li&gt;I downloaded Firefox, as it has some nice developer tools for visualising a grid on the page.&lt;/li&gt;
&lt;li&gt;I learned a little about product management in a &#39;brown bag&#39; talk at &lt;a href=&quot;https://clearleft.com/&quot;&gt;Clearleft&lt;/a&gt;. Very interesting learning about exercises to coordinate teams and define roles (including those of clients) within a project and help everyone communicate better.&lt;/li&gt;
&lt;li&gt;Talked with Jeremy about my upcoming &lt;a href=&quot;https://web.material.is/2017/&quot;&gt;Material&lt;/a&gt; conference talk. We brainstormed lots of great ideas that I wrote down. My next step is mindmapping to find some golden connections between ideas.&lt;/li&gt;
&lt;li&gt;Chatted with Jeremy and Luke about roles that involve both front end development and UX. An area that draws heavily on both roles is performance, particularly percieved performance.&lt;/li&gt;
&lt;li&gt;Jeremy recommended some books on writing - including Steven Pinker&#39;s &#39;Sense of Style&#39;, particularly the chapter on &#39;The Curse of Knowledge&#39;, and &#39;Bird by Bird&#39; by Anne Lamott.&lt;/li&gt;
&lt;li&gt;I learned of the &lt;a href=&quot;https://openlibrary.org/&quot;&gt;Open Library&lt;/a&gt; where e-books are lent out free of charge.&lt;/li&gt;
&lt;li&gt;Talked with Jeremy and &lt;a href=&quot;https://clearleft.com/team/hana-stevenson&quot;&gt;Hannah&lt;/a&gt; about &lt;a href=&quot;https://amberwilson.co.uk/blog/cookies/&quot;&gt;cookies&lt;/a&gt;, caching, and public speaking.&lt;/li&gt;
&lt;li&gt;I was introduced to a number of very useful &lt;a href=&quot;https://adactio.com/journal/9732&quot;&gt;thought exercises&lt;/a&gt; I can have a go at once I have some content for my talk.&lt;/li&gt;
&lt;li&gt;I discovered Google&#39;s &lt;a href=&quot;https://developers.google.com/speed/pagespeed/insights/&quot;&gt;Page Speed Insights&lt;/a&gt; tool for evaluating websites.&lt;/li&gt;
&lt;li&gt;Jeremy set me homework - &lt;a href=&quot;https://twitter.com/ambrwlsn90/status/852557145853833218&quot;&gt;&#39;What is the Difference Between HTTP and HTTPS?&#39;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeremy suggested talks that could help me with mine from &lt;a href=&quot;http://2017.render-conf.com/&quot;&gt;Render Conference 2017&lt;/a&gt; - Ana Balica&#39;s talk on &lt;a href=&quot;https://www.youtube.com/watch?v=DtTKF5OcpsU&quot;&gt;HTTP&lt;/a&gt; and Frances Ng&#39;s &lt;a href=&quot;https://www.youtube.com/watch?v=Df0-2e6M_y4&quot;&gt;rise from Aerospace Engineer to Front-End Engineer.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeremy introduced me to @supports in CSS, plus a neat way to &lt;a href=&quot;https://fontfaceobserver.com/&quot;&gt;load fonts&lt;/a&gt; using JavaScript that improves perceived performance by customising font loading behaviour.&lt;/li&gt;
&lt;li&gt;Jeremy showed me the difference between not using the font-loading method vs. using it. There was a really large difference in perceived performance (font loading was better, despite the page loading slightly slower).&lt;/li&gt;
&lt;li&gt;Jeremy showed me 4 design boards (each from a different designer) that helped him design his event site for &lt;a href=&quot;http://patternsday.com/&quot;&gt;Patterns Day&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I saw some &#39;page painting&#39; in chrome developer tools showing after a discussion on &#39;janky&#39; sites. Jeremy told me he had to remove an image from his event site after he found it to be create this unwanted phenomenon.&lt;/li&gt;
&lt;li&gt;I was introduced to &lt;a href=&quot;https://css-tricks.com/examples/ShapesOfCSS/&quot;&gt;CSS shapes&lt;/a&gt; and the browsers that currently &lt;a href=&quot;https://caniuse.com/#search=css%20shapes&quot;&gt;support them&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An intense but fantastic day - I&#39;d like to thank Jeremy once again for his time and great advice :)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Preparing to Talk</title>
      <link href="https://amberwilson.co.uk/blog/preparingtotalk/"/>
      <updated>Thu, 13 Apr 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/preparingtotalk/</id>
      <content type="html"> &lt;blockquote&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;
    If you went to &lt;a href=&quot;https://twitter.com/hashtag/BrightonSEO?src=hash&quot;&gt;#BrightonSEO&lt;/a&gt; and thought &amp;quot;Hey, it would be cool to speak on stage one day&amp;quot;... Read this! &lt;a href=&quot;https://t.co/Xhdj2RI0w6&quot;&gt;https://t.co/Xhdj2RI0w6&lt;/a&gt; &lt;a href=&quot;https://t.co/8nayH2lBNs&quot;&gt;pic.twitter.com/8nayH2lBNs&lt;/a&gt;&lt;/p&gt;&amp;mdash; Hannah Butcher (@HannahFButcher) &lt;a href=&quot;https://twitter.com/HannahFButcher/status/852123851387547648&quot;&gt;April 12, 2017
    &lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is T-minus 4 months and 3 days until I am due to give my &lt;em&gt;first&lt;/em&gt; talk on web stuff at &lt;a href=&quot;https://web.material.is/2017/&quot;&gt;Material&lt;/a&gt; in Iceland.&lt;/p&gt;
&lt;p&gt;I decided to jump in the &lt;strong&gt;deep end&lt;/strong&gt; with this one, but I&#39;m &lt;strong&gt;relishing&lt;/strong&gt; the challenge.&lt;/p&gt;
&lt;p&gt;Recently, I&#39;ve gathered resources on public speaking, talked to people about it, and joined clubs like &lt;a href=&quot;http://brightonandhovespeakersclub.com/&quot;&gt;Brighton and Hove Speakers Club&lt;/a&gt; (BAHSC).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hannahfbutcher&quot;&gt;Hannah Butcher&lt;/a&gt;, the author of the quote above, recommends this: &lt;strong&gt;Identify a topic, choose a title, get your slides ready, build your confidence.&lt;/strong&gt; Hannah also talks of being an introvert and how this doesn&#39;t stop her from speaking on stage, which is great.&lt;/p&gt;
&lt;p&gt;I can&#39;t thank people enough for getting their advice and stories of personal experience out there. I am also humbled by the kindness of other speakers, particularly at &lt;a href=&quot;http://brightonandhovespeakersclub.com/&quot;&gt;BAHSC&lt;/a&gt; where I had my first meeting last night. The members are so eager to help and so wonderfully positive that I&#39;ll surely thrive under their guidance. They even offered to give up weekends to mentor me and help me practice my talk.&lt;/p&gt;
&lt;p&gt;Next step - prepare my talk. Another fun step :) Let&#39;s go!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Cookies</title>
      <link href="https://amberwilson.co.uk/blog/cookies/"/>
      <updated>Tue, 11 Apr 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/cookies/</id>
      <content type="html">&lt;p&gt;&lt;strong&gt;What is a cookie?&lt;/strong&gt; If you have a sweet tooth like me you might imagine a round, freshly-baked treat containing chocolate chips:&lt;/p&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/cookies/img/cookie.svg&quot; alt=&quot;cookie&quot; /&gt;
&lt;p&gt;Conversely, internet cookies (a.k.a. HTTP cookies) contain data, usually in the form of a text file:&lt;/p&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/cookies/img/text.svg&quot; alt=&quot;text file&quot; /&gt;
&lt;p&gt;&lt;strong&gt;What&#39;s in the name?&lt;/strong&gt; Derived from the term &#39;magic cookies&#39; (packets of data that have been used to send data over the web since 1979) the term &#39;cookie&#39; was coined by Lou Montulli and first utilised as an e-commerce solution in 1994. They enabled items in a shopping cart to be saved while you browsed the rest of the site. Cookies quickly gained popularity and began to be used for other purposes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do cookies work?&lt;/strong&gt; When you visit a site, it saves information about you to a document (a cookie) on your hard drive, via HTTP. When you browse or return to a site, saved cookies are sent back to the site&#39;s server. Sites mainly use these cookies for the following purposes; updating your preferences, keeping you logged in/remembering items in your cart, or tracking your path through the site.&lt;/p&gt;
&lt;p&gt;In essence, cookies leave a sort of bread crumb trail on the web, allowing sites to tailor information specifically for you. They can store all sorts of data, and these are determined by the site&#39;s creator. They are website-specific, meaning a cookie created by one website cannot be read by another.&lt;/p&gt;
&lt;p&gt;However, one site can contain bits of another, e.g. adverts. If you previously visited, say, an online clothes store, you are likely to have cookies from this site saved on your computer. When you visit a different site on which the clothes store&#39;s adverts are embedded, the store is able to access the cookies they saved earlier and dynamically alter the ads to fit your preferences. These cookies are &#39;third party&#39; cookies. They come from a different domain than the site you are on. Many browsers allow these by default, although there are ways to block them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about privacy?&lt;/strong&gt; After years of ethics debates, in 2011 an EU law was passed stating sites using cookes had to alert visitors, seek permission to store and retrieve data, and draft &lt;a href=&quot;http://www.cim.co.uk/more/cookies/&quot;&gt;policies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See the following examples -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flic.kr/p/Tz2jHV&quot;&gt;Cookies example one&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flic.kr/p/StX1Dh&quot;&gt;Cookies example two&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Need more information?&lt;/strong&gt; Some great resources exist on the privacy and security issues surrounding cookies. &lt;a href=&quot;http://www.cim.co.uk/more/cookies/&quot;&gt;This&lt;/a&gt; site explains how to opt out of cookies in different browsers. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#SameSite_cookies&quot;&gt;This&lt;/a&gt; MDN article covers security and how cookies are sent over HTTP response headers. &lt;a href=&quot;http://resources.infosecinstitute.com/securing-cookies-httponly-secure-flags/#gref&quot;&gt;This&lt;/a&gt; article provides very detailed information on how to keep information stored in cookies secure. &lt;a href=&quot;http://www.whatarecookies.com/&quot;&gt;This&lt;/a&gt; site contains a wide breadth of information and helpful tips.&lt;/p&gt;
&lt;p&gt;Thanks for reading my short article. I wrote it from scratch with no previous knowledge of cookies. It was fun to learn and I hope to continue increasing my understanding. Please share your own thoughts and research processes!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>UX Curriculum</title>
      <link href="https://amberwilson.co.uk/blog/ux-curriculum/"/>
      <updated>Sat, 08 Apr 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/ux-curriculum/</id>
      <content type="html">&lt;p&gt;Inspired by David Venturi&#39;s &lt;a href=&quot;https://medium.com/@davidventuri/i-dropped-out-of-school-to-create-my-own-data-science-master-s-here-s-my-curriculum-1b400dcee412&quot;&gt;writing&lt;/a&gt;, this article includes a bit about me, something about fun, and my UX curriculum. Being new to User Experience Design, I found this to be a really useful thought exercise and I hope you do too.&lt;/p&gt;
&lt;p&gt;Have you pursued higher education or years of work experience in a field unrelated to design? Live in a city but don’t have the money or time to pursue a User Experience or Human-Computer Interaction degree?&lt;/p&gt;
&lt;p&gt;If so, we have something in common.&lt;/p&gt;
&lt;p&gt;It is possible to take what you already know and apply it to a career in UX design. Passion, self-learning and reaching out to others in the industry will help get you there.&lt;/p&gt;
&lt;p&gt;I’ve met people from a huge number of backgrounds ranging from marine biologist to maths teacher to anthropologist to marketer who have all been successful switching their career to digital. They have all been more than happy to talk to me about their experiences and help guide me to form my own.&lt;/p&gt;
&lt;p&gt;Why do I like User Experience Design?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’ve always had a spark of creativity inside me, finding my happy place in hobbies of drawing, designing and photography.&lt;/li&gt;
&lt;li&gt;I have a background in psychology and completed a Master&#39;s in Child and Adolescent Psychology &lt;a href=&quot;http://en.mastersinleiden.nl/programmes/child-and-adolescent-psychology/en/introduction&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The UX industry is dynamic, encourages life-long learning and is &lt;em&gt;fun&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;“&lt;strong&gt;You can’t be creative if you’re not having fun&lt;/strong&gt;” - Dave Kelly of IDEO&lt;/p&gt;
&lt;p&gt;This phrase speaks to me on many levels. It reminds me of the magic of childhood where play is encouraged and creativity is always rewarded. Adults glean delight from witnessing children having fun, and will always seek opportunities for them to have it.&lt;/p&gt;
&lt;p&gt;Why then is fun encouraged so much less in adulthood? A culturally-defined cut-off age, for example 18, signifies a sharp boundary between childhood and adulthood. Between playful learning and serious responsibilities. There &lt;em&gt;are&lt;/em&gt; responsibilities to be serious about but, as is more often the case these days, young adults tend to get bogged down and feel hopeless when it comes to fulfilling them.&lt;/p&gt;
&lt;p&gt;Imagine if it was a top priority of employers to make workspaces as fun as possible, help employees feel good, and inspire creativity. Maybe this isn’t feasible in every workplace, but it seems to be readily encouraged and available in the creative industry. I want to experience for the first time what it is like to be part of such a fun and nurturing environment, while getting to indulge my hobbies every day.&lt;/p&gt;
&lt;p&gt;I’ve had a go at creating my own UX curriculum based on my psychology Master’s programme. This exercise has helped me uncover important aspects of UX that were not apparent at first. I wrote it based on what I&#39;ve learned in the past nine months (from knowing nothing about the industry to getting an internship). I&#39;d like it to show UX from a different perspective and help inspire people to learn more. These articles really helped me get started - &#39;&lt;a href=&quot;https://uxplanet.org/inclusive-ux-education-designing-a-free-online-learning-curriculum-52154a188af3&quot;&gt;Designing a free online learning curriculum&lt;/a&gt;&#39; and &#39;&lt;a href=&quot;https://blog.prototypr.io/how-to-teach-yourself-ux-design-31f16e41b189&quot;&gt;How to teach yourself UX design&lt;/a&gt;&#39;. Please note what I&#39;ve written below isn&#39;t exhaustive and is meant to be taken light-heartedly and encourage thought :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Original Curriculum (&lt;a href=&quot;http://en.mastersinleiden.nl/programmes/child-and-adolescent-psychology/en/programme&quot;&gt;MSc Child and Adolescent Psychology&lt;/a&gt;)- need minimum of (65) points:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Compulsory components&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Advanced Psychodiagnostics in Children and Adolescents (5)&lt;/li&gt;
&lt;li&gt;Behaviour Training with Children (5)&lt;/li&gt;
&lt;li&gt;Solution Focused Therapy (5)&lt;/li&gt;
&lt;li&gt;Cognitive Behaviour Therapy with Young People (5)&lt;/li&gt;
&lt;li&gt;Master Thesis in MSc. Psychology (20)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Choose one of the following options as an internship&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal Practical Internship (10)&lt;/li&gt;
&lt;li&gt;Practical Internship Psychology (10)&lt;/li&gt;
&lt;li&gt;Research Internship Psychology (MSc) (10)&lt;/li&gt;
&lt;li&gt;Clinical Practical Internship Psychology (20)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Recommended elective(s)&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Child Neuropsychology: Theory and Assessment of Neurodevelopmental Disorders (5)&lt;/li&gt;
&lt;li&gt;Trainers Course Communication Skills (5)&lt;/li&gt;
&lt;li&gt;Advanced Child and Adolescent Psychiatry (5)&lt;/li&gt;
&lt;li&gt;Transdiagnostic Approach of Eating Disorders (5)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;New Curriculum - need minimum of (65) points:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Compulsory components&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cognitive Psychology (5) - &lt;em&gt;examining the brain from a neuronal/chemical level to understand how users think, what their motivations are, what they need&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Web Development (5) - &lt;em&gt;HTML/CSS/JavaScript, introduction to backend systems, CMS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;People Management in Research (5) - &lt;em&gt;users, clients, stakeholders (getting people to realise what they need versus what they want/think they need)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Quantitative and Qualitative Research Methods in UX (5) - &lt;em&gt;differences, when to choose, types, mixing.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Design Tools (5) - &lt;em&gt;photoshop, illustrator, affinity - watch online video tutorials (YouTube, Udemy, Lynda etcetera)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Master Thesis in MSc. UX (15)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Choose one of the following options as an internship&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal Practical Internship (10) - &lt;em&gt;a small project for a friend (e.g. website redesign for a friend or non-profit)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Practical Internship Psychology (10) - &lt;em&gt;source and contact a firm, enquire about helping on one project for 4-6 weeks, ask for a formal feedback procedure (see requirements and feedback template for this in course folder)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Clinical Practical Internship Psychology (20) - &lt;em&gt;secure an internship in a firm lasting no less than three months and up to six. Ask for formal feedback procedure (see requirements and feedback template for this in course folder)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Recommended elective(s)&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empathy in Design (5) - &lt;em&gt;more in-depth cover of this important topic&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Trainers Course Communication Skills (5)&lt;/li&gt;
&lt;li&gt;Time Management &amp;amp; Organisational Skills (5)&lt;/li&gt;
&lt;li&gt;Public Speaking Workshops (5) - &lt;em&gt;modes of presenting&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Reading list.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
    
    <entry>
      <title>GET vs. POST Requests</title>
      <link href="https://amberwilson.co.uk/blog/getvspost/"/>
      <updated>Mon, 27 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/getvspost/</id>
      <content type="html">&lt;p&gt;Amidst a learning spree on semantic HTML and the ways servers communicate with web browsers, I was introduced to &#39;GET&#39; and &#39;POST&#39; requests.&lt;/p&gt;
&lt;p&gt;These are HTTP (Hypertext Transfer Protocol - the language the browser uses to &#39;speak&#39; with servers) request methods, typically used for sending and receiving data in forms. They are written like this inside the HTML5 form element:&lt;/p&gt;
&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;GET&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt; or &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The semantics behind the form element could form (see what I did there?) another lesson entirely. They are explained nicely &lt;a href=&quot;https://internetingishard.com/html-and-css/forms/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GET and POST requests can be tricky to understand because some explanations are too techincal and miss the big picture. Here are some basics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GET requests are the default method used by browsers, meaning that if no method is specified, a GET request will be issued automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Both methods are able to send to and retrieve from data a server, however GET should only really be used as a &#39;getter&#39; for retrieving data, because using it to send data raises some privacy issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GET requests send information (name and value pairs in forms) within the URL of HTTP requests, rather than in the body. This means information submitted in a form will be visible in the URL. For example, when logging into a site, sensitive information such as a password would be part of the URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In addition, a limited amount of data can be displayed in a URL. This means submitted data could be lost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;POST requests send information in a separate header file. Data sent this way is also not encrypted, but is safer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This &lt;a href=&quot;https://www.youtube.com/watch?v=9o_4lsOkQ3g&amp;amp;t=307s&quot;&gt;video&lt;/a&gt; gives a practical example and describes further differences between GET and POST (skip to 5:19).&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The Internet and The World Wide Web</title>
      <link href="https://amberwilson.co.uk/blog/webvsinternet/"/>
      <updated>Thu, 16 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/webvsinternet/</id>
      <content type="html">&lt;p&gt;I was tasked by &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; to explore the differences between the &lt;em&gt;Internet&lt;/em&gt; and &lt;em&gt;The World Wide Web&lt;/em&gt;. At the start, I was hard pressed to explain them. All I knew is that the &#39;Web&#39; was created by someone called &lt;a href=&quot;https://en.wikipedia.org/wiki/Tim_Berners-Lee&quot;&gt;Tim Berners-Lee&lt;/a&gt;. I thought this meant he&#39;d invented the entire Internet. I soon realised how wrong I was.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/webvsinternet/img/webvsinternet.jpg&quot; alt=&quot;web versus internet task&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This &lt;a href=&quot;http://www.webopedia.com/DidYouKnow/Internet/Web_vs_Internet.asp&quot;&gt;site&lt;/a&gt; describes the differences in one sentence - &amp;quot;The Internet is a giant network connecting everyone&#39;s computers and it uses languages known as protocols to send information, and the Web is just one of these protocols&amp;quot;. Simple, right? I went on to read that the Web is built &#39;on top of&#39; the Internet. My confusion began. I knew I needed to get some background knowledge.&lt;/p&gt;
&lt;p&gt;On Tim Berners-Lee&#39;s Wikipedia page were unfamiliar terms such as CERN, Hypertext, Transmission Control Protocol, etc. I deciphered that &#39;hypertext&#39; is used to compile documents, &#39;hyperlinks&#39; allow linking between such documents, and &#39;hypertext transfer protocol&#39; (HTTP) is the internet protocol used to exchange or transfer hypertext. However, this didn&#39;t tell me about how the Internet and Web differ. This &lt;a href=&quot;https://youtu.be/j4cN_q3NX9c&quot;&gt;video&lt;/a&gt; describing Tim Berners-Lee&#39;s life, this Wikipedia &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_browser&quot;&gt;article&lt;/a&gt; and Jeremy&#39;s &lt;a href=&quot;https://resilientwebdesign.com/&quot;&gt;book&lt;/a&gt; helped me figure out the following.&lt;/p&gt;
&lt;p&gt;In short, in 1980, Tim worked for a company called CERN, the European Organization for Nuclear Research, and created a program called &#39;Enquire&#39;. This let him easily manage information within the company by interlinking keywords in text documents. Such linking of textual information creates hypertext, and the links between them form hyperlinks. The hypertext transfer protocol communicates with the Internet to allow information transfer. This is the basis for the Web.&lt;/p&gt;
&lt;p&gt;Long before this, the giant network known as the Internet (term coined in 1983) had already become an established part of many universities and scientific institutions. Functioning via physical connections that had already been laid for telegraphs and telephones, this decentralised network was robust in that it could still function even if parts of it failed.&lt;/p&gt;
&lt;p&gt;The problem was that the Internet linked very different computer operating systems. Recalling knowledge from one to another required hefty expertise. In 1989, CERN wanted Tim back to help them with this issue. He created &#39;hypertext markup language&#39; (HTML - based on CERN&#39;s &#39;standard generalised markup language&#39; or SGML) and &#39;uniform resource locaters&#39; (URLs). These allowed information to be accessed more readily.&lt;/p&gt;
&lt;p&gt;The World Wide Web had been born. However, it only ran on the operating system used at CERN (NeXTSTEP), and the browser Tim created for it (the world&#39;s first) called &#39;World Wide Web&#39; ran only on NEXT computers. Nicola Pellow saw to this problem by creating the &#39;Line Mode Browser&#39; at CERN. Many browsers followed. These browsers could be installed on any computer, thus allowing anyone to use the Web.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I ended my research with this &lt;a href=&quot;https://www.youtube.com/watch?v=yF5-6AcohQw&quot;&gt;lecture&lt;/a&gt; by Tim Berners-Lee. It is his account of how the Web just &#39;happened&#39;, mixed with an enthusiastic account of the powerful personal and social reasons behind it. He explains how certain creations, e.g. a telephone, only work if other people use it as well. To build a sufficient network, you need early adopters, people with a &#39;gleam in their eye&#39; as he puts it. He explains how everything that has been designed for use over the Internet or the Web is just like this and so can be deemed both technical and social. He goes on to explain how the Web took off:&lt;/p&gt;
&lt;p&gt;&amp;quot;It&#39;s the psychology of people wanting to be read that makes them make links to other good things. And when they make links to other good things, by doing that, they are actually voting for those other good things. And the links themselves form this huge mass of critical review, which is actually how the web works. And the search engines aren&#39;t smart, they just use that massive critical review, put in by human beings. So, the search engines all rely on those links, critically. So, it&#39;s all about people. The system is a social, technical thing. The design of the technology and the design of the social piece - absolutely intimately linked.&amp;quot;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Markup-Masterclass</title>
      <link href="https://amberwilson.co.uk/blog/markup-masterclass/"/>
      <updated>Thu, 16 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/markup-masterclass/</id>
      <content type="html">&lt;p&gt;Today I spent a great day at &lt;a href=&quot;https://clearleft.com/&quot;&gt;Clearleft&lt;/a&gt;, soaking in the lovely atmosphere, chatting with the wonderful staff. I sat down in the morning to talk with &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; about the web and the internet, web apps and native apps. We chatted about tech company structures, job titles, career advice and much more.&lt;/p&gt;
&lt;p&gt;For the main part of my day, Jeremy set me the task of re-formatting my CV (currently only in PDF format) into an HTML document. I thought to myself “ah, easy!”. I had little inkling of all the new things I would learn, or how much fun I&#39;d have. See a summary of my learning at the end.&lt;/p&gt;
&lt;p&gt;I began like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy and paste text from the PDF file into my code editor.&lt;/li&gt;
&lt;li&gt;Add some &lt;code&gt;h&lt;/code&gt; elements that matched to the size I wanted the text to be.&lt;/li&gt;
&lt;li&gt;Use a bunch of &lt;code&gt;br&lt;/code&gt; elements to break up my text.&lt;/li&gt;
&lt;li&gt;Add some hyperlinks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right, the page looked well structured, and I thought I&#39;d nailed the task already. &amp;quot;&lt;strong&gt;Next!&lt;/strong&gt;&amp;quot; I shouted in my head. I ask Jeremy to come see what I&#39;d accomplished. He told me I had been fast. A little too fast, perhaps?&lt;/p&gt;
&lt;p&gt;Firstly, he noted that I hadn&#39;t filled in a title, something very important. He then sat down and taught me about &#39;metadata&#39;. This is data that describes other data. I added &#39;description&#39;, &#39;keywords&#39;, and &#39;viewport&#39; meta tags (e.g. meta name=“description”), and gave each some “content” (e.g. Amber Wilson&#39;s CV). A meta tag that&#39;s commonly used these days in the era of responsive design is the &#39;viewport&#39; meta tag. It controls layout on mobile browsers and allows users to pinch and zoom content.&lt;/p&gt;
&lt;p&gt;Jeremy noticed I had formatted my paragraphs using the &lt;code&gt;div&lt;/code&gt; element. He asked me why and I told him that I wanted to use them as a visual aid for breaking up sections of text. We then discussed the difference between &lt;code&gt;div&lt;/code&gt; and &lt;code&gt;span&lt;/code&gt; elements. Both essentially do nothing, except that the former acts as a block element, the latter as inline. We then went on to discuss &lt;code&gt;section&lt;/code&gt; and &lt;code&gt;article&lt;/code&gt; elements. I was using a site that gave a handy list of HTML5 elements, &lt;a href=&quot;https://www.w3schools.com/&quot;&gt;W3 Schools&lt;/a&gt;, which Jeremy told me to exit immediately. This site may have hijacked the World Wide Web Consortium&#39;s (W3C&#39;s) name and be at the top of all search results, but it is one to be avoided. The &lt;a href=&quot;https://developer.mozilla.org/en-US/&quot;&gt;Mozilla Developer Network&lt;/a&gt; (MDN) is much better.&lt;/p&gt;
&lt;p&gt;I swapped &lt;code&gt;div&lt;/code&gt; elements with &lt;code&gt;section&lt;/code&gt; elements. I thought these elements only helped developers make sense of code. I was wrong. They also differ practically in that &lt;code&gt;section&lt;/code&gt; elements help assistive technology and search bots decipher site content for the benefit of all users. By now, I thought that I really must have nailed the perfect semantic document. I thought I&#39;d try to be clever and stick an &lt;code&gt;hgroup&lt;/code&gt; element in - something I read about on the MDN. I triumphantly called Jeremy over. In a fraction of a second, he&#39;d spotted my error and told me to research &#39;hgroup&#39; more. After ten minutes, I hadn&#39;t got far.&lt;/p&gt;
&lt;p&gt;Jeremy recommended I find a way to validate my markup. I found the &lt;a href=&quot;https://validator.w3.org/&quot;&gt;w3c HTML validator&lt;/a&gt;, and almost switched it off because it looks like a W3 Schools site. I was wrong, it is a W3C site. No matter how hard I tried, I couldn&#39;t get it to tell me my &#39;hgroup&#39; element was valid. The realisation came that I&#39;d been trawling quite heavily out-of-date sites for a lot of information. Eventually, I scrolled down the MDN page a little more and saw that this element was removed from the HTML5 specification. Oops.&lt;/p&gt;
&lt;p&gt;Recapping, I&#39;d gotten rid of my &lt;code&gt;hgroup&lt;/code&gt; element, I had my &lt;code&gt;section&lt;/code&gt; elements in place, and I&#39;d added my meta data. What else? Next, I was asked why my &#39;h&#39; elements were all odd sizes. I said it was because I wanted the headings to present text in a certain size. I was told this is CSS&#39;s job and to &amp;quot;not worry about how it looks&amp;quot;. These elements are for adding structural outline to a page. I changed my markup until I received this outline summary from W3C -&lt;/p&gt;
&lt;img src=&quot;https://amberwilson.co.uk/blog/markup-masterclass/img/outlines.png&quot; alt=&quot;W3C header summary&quot; /&gt;
&lt;p&gt;Jeremy noticed other content where I&#39;d been more concerned about presentation than structure. I was again reminded &lt;em&gt;take my mind off presentation and focus on the structure&lt;/em&gt;. I could change the presentation later with CSS. I wanted some sections to have content that sat in a nice line. After successfully pushing the urge to present the content this way, I put it all into list (&lt;code&gt;ol&lt;/code&gt; and &lt;code&gt;li&lt;/code&gt;) elements. I was introduced to elements I&#39;d never heard of - &lt;code&gt;dl&lt;/code&gt;, &lt;code&gt;dt&lt;/code&gt; and &lt;code&gt;dd&lt;/code&gt;. These go a step further than list elements and add semantic meaning. The &#39;time&#39; element is also new for me, and I added this to all dates.&lt;/p&gt;
&lt;p&gt;Some more reading on the MDN taught me that the humble &lt;code&gt;br&lt;/code&gt; element, is now obsolete. Jeremy encouraged me to use the &lt;code&gt;p&lt;/code&gt; element in their place. I didn&#39;t think I could live without &lt;code&gt;br&lt;/code&gt;, but &lt;code&gt;p&lt;/code&gt; came to the rescue. Lastly, I asked Jeremy about the &#39;hcard&#39; element, one I&#39;d learnt about in &lt;a href=&quot;https://indieweb.org/Homebrew_Website_Club&quot;&gt;Homebrew Website Club&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This element is a microformat used for embedding data (on people, companies and organisations) and making it more easily accessible on the web for use in applications and services. It should be noted that &lt;a href=&quot;http://microformats.org/wiki/microformats-2&quot;&gt;microformats2&lt;/a&gt; have superceded the &lt;a href=&quot;http://microformats.org/wiki/hcard&quot;&gt;classic microformats&lt;/a&gt;. I added &lt;code&gt;p-name&lt;/code&gt;, &lt;code&gt;u-url&lt;/code&gt;, &lt;code&gt;u-tel&lt;/code&gt; and &lt;code&gt;u-email&lt;/code&gt; for my name, site, phone number and email. There are a wide range of microformat elements to explore. I am still in the process of doing this and want to add a &#39;resume&#39; element soon.&lt;/p&gt;
&lt;p&gt;Here&#39;s a summary of what I learned today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Focus on the structure and meaning of elements, not the presentation.&lt;/li&gt;
&lt;li&gt;Think of the &#39;h&#39; element as structural, not presentational.&lt;/li&gt;
&lt;li&gt;Search up-to-date information when researching correct HTML markup.&lt;/li&gt;
&lt;li&gt;Check elements have not become obsolete.&lt;/li&gt;
&lt;li&gt;Place elements in order of their importance.&lt;/li&gt;
&lt;li&gt;Pay attention to meta tags and microformats.&lt;/li&gt;
&lt;li&gt;Always validate your markup.&lt;/li&gt;
&lt;li&gt;&amp;amp; a lot more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you &lt;a href=&quot;https://adactio.com/&quot;&gt;Jeremy&lt;/a&gt; for teaching me.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Learning</title>
      <link href="https://amberwilson.co.uk/blog/learning/"/>
      <updated>Thu, 16 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/learning/</id>
      <content type="html">&lt;blockquote&gt;
    &lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Best thing you can do for your career is to be active outside your employer. Publish, speak, build. Repeat.
        Publish, speak, build. Repeat.&lt;/p&gt;&amp;mdash; Rachel🦄Nabors (@rachelnabors) &lt;a href=&quot;https://twitter.com/rachelnabors/status/881730920331452416&quot;&gt;July 3, 2017&lt;/a&gt;
&lt;/blockquote&gt;
&lt;p&gt;I discover ideas every day by talking to people, listening to them, reading, writing, attending events, going to meetups, sharing ideas, pushing myself out of my comfort zone.&lt;/p&gt;
&lt;p&gt;None of these are restricted to Web development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I studied psychology for six years. I bring a huge number of things I learned from that experience to my new job as a Web developer every day.&lt;/li&gt;
&lt;li&gt;I read books on writing, artificial intelligence, war-torn Cambodia and many more. They help me get a broader, more informed view of the world, and this helps me be a better developer.&lt;/li&gt;
&lt;li&gt;I am interested in the stories and views of everyone I meet. The variety of things I&#39;ve learned from people by just asking them questions is amazing.&lt;/li&gt;
&lt;li&gt;I&#39;ve volunteered and worked for companies that have nothing to do with technology. Every single one allowed me to meet people and learn things that make me a more well-rounded developer.&lt;/li&gt;
&lt;li&gt;I&#39;ve worked and lived in (for at least 6 months) six different countries. Being immersed in cultures unlike my own helped me open my mind, consider others&#39; points of view and learn that our similarities are stronger than our differences.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There have been so many moments where I’ve gone a little out of my way, above and beyond the call of duty, to seek out a new perspective, and come away thinking ‘Wow, my views have just been entirely shaken up or changed’.&lt;/p&gt;
&lt;p&gt;Such moments are like little flames that keep me motivated and constantly wanting to find more. I don’t know how many people get to experience such shifts in their views as often as I do, but it’s something that feeds my thirst to know more, get a more holistic view of the Web industry and figure out how I can help it move in a good direction.&lt;/p&gt;
&lt;p&gt;I&#39;ve been granted so many cool opportunities by being proactive and enthusiastic about learning. To name a few: a internship where I get paid to learn, a great and supportive mentor, a chance to speak internationally, a meetup where I learned and now teach, a website where I can spill my thoughts, endless tips and advice, a huge and amazing network of friends, etc.&lt;/p&gt;
&lt;p&gt;The Web is at a point where more of us need to be putting in some effort to get a broader view of the world and the people living here. The social effects of the Web are stretching further and further every day. More and more people are getting access to it. More than ever, we need to make sure it&#39;s an accessible and secure place for everyone.&lt;/p&gt;
&lt;p&gt;Make a plan, set yourself &lt;a href=&quot;https://cirillocompany.de/pages/pomodoro-technique&quot;&gt;time&lt;/a&gt;, push yourself out of your comfort zone, talk to people, write down what you learn, enjoy what you experience. Get excited about learning and experiencing. &lt;strong&gt;Get excited about Web development&lt;/strong&gt;. The Web needs you :)&lt;/p&gt;
&lt;p&gt;Get in touch with me if you have any thoughts about this article, how you learn outside your employer, or to share what excites you about Web development :)&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Podcasts and Knowledge Sharing</title>
      <link href="https://amberwilson.co.uk/blog/podcasts/"/>
      <updated>Tue, 07 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/podcasts/</id>
      <content type="html">&lt;p&gt;Let’s talk about podcasts. I have always liked the idea of them. Like audio books, you can take them anywhere and listen anytime. They enable you to access up-to-date, current opinions on just about any facet of life you can think of. If you’re wondering whether there is a podcast on a topic you’re interested in, I can bet you there is. And, if not, you could make one. Please excuse me while I shield my ears while you scream “but what could anyone ever learn from ME?!”.&lt;/p&gt;
&lt;p&gt;Over the past months, I’ve encountered people who are on the extreme ends of willingness to share experiences, either though speaking, blogging, or through other forms of communication. Some have animatedly explained how writing about their experiences has not only helped them track progress, but also consolidate their knowledge and receive thanks from people. Others look at me with mild confusion and ask what good could possibly come from sharing their pallid, commonplace, and unremarkable experiences.&lt;/p&gt;
&lt;p&gt;I’ve always been at the more willing extreme when it comes to writing about what I’ve done. To me, the idea of helping or inspiring even one person this way gives me a warm, glowing feeling inside. I believe that information and education are important for leading a more happy and productive life. A person can learn, through reading about or listening to people with similar experiences, ways to increase their own happiness and that of those around them. Shared knowledge is power. Not only does this knowledge teach us, it makes us feel more connected to each other. And this is a beautiful and comforting thing.&lt;/p&gt;
&lt;p&gt;A lot of the time, learning from others involves emotion. Hearing about similar experiences from others, being able to relate to their ideas and thoughts, can bring rushes of exhilaration, moments of ‘a-ha!’, and sobering realisations. When we share, we place a little bit of ourselves out there for others to do with what they will. There is a sense of vulnerability to this. It is the willingness to be vulnerable, though, that can encourage others come out of their shells and rejoice in their new-found knowledge. They may feel inspired, motivated, reassured, at ease.&lt;/p&gt;
&lt;p&gt;I believe that sharing of knowledge and experiences should never be discouraged. Personally, I’ve always found that other people’s perspectives hugely increase my ability to step outside myself and consider the bigger picture. I always find that this improves my wellbeing. Our own perspectives can become stale and fragmented so quickly, which can lead us to feel confused, worried, unsure, and even sad. I like to gather as many different perspectives on a single subject as I can. Each perspective is like a puzzle piece. Put them together and you have a brightly-coloured, easily-understood, comprehensive view of the thing you are trying to make sense of.&lt;/p&gt;
&lt;p&gt;The topic of this post is podcasts, but communicating your ideas can take many forms. Another method is blogging. This is something I absolutely love. I don’t only enjoy doing it myself, but also when other people do it. I always feel a child-like thrill when I discover an awesome piece of writing from someone on a topic I am interested in. My feelings rise to ecstatic when I realise the author is also incredibly passionate about what they are writing. Recently, much of what I have read or listened to has been about tech. I still read up on many other things, especially on psychology and life (I am especially interested in how parents raise their children). I’ll write a new post on the podcasts I like listening to and the blogs I like reading soon. Look out for it and remember, don’t be afraid to share! Connect with others through your ideas and help to build a more informed and happy world.&lt;/p&gt;
&lt;p&gt;Also published on &lt;a rel=&quot;syndication&quot; class=&quot;u-syndication&quot; href=&quot;https://medium.com/@ambrwlsn90/podcasts-and-knowledge-sharing-e90d84050bfa#.uo4u39c78&quot;&gt;Medium&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Mentorship</title>
      <link href="https://amberwilson.co.uk/blog/mentorship/"/>
      <updated>Mon, 06 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/mentorship/</id>
      <content type="html">&lt;p&gt;It was around October last year when I arrived at 68 Middle Street for a &lt;a href=&quot;http://codebar.io/&quot;&gt;codebar&lt;/a&gt; session. It was the first time I had been in the building and I was immediately struck by how spaceous and well-designed it was. Even if I wasn&#39;t entirely sure what people did there. I had begun coming to &lt;a href=&quot;http://codebar.io/&quot;&gt;codebar&lt;/a&gt; about two months prior, and hadn&#39;t missed a single session. I loved how I got to see a different working environment each week and meet developers from any and all backgrounds. Not to mention, I was completely blown away when I first attended. The brilliant &lt;a href=&quot;https://twitter.com/Lottejackson&quot;&gt;Lotte Jackson&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rosaemerald&quot;&gt;Rosa Fox&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/notthepoint&quot;&gt;Dorothy Wingrove&lt;/a&gt; showed me that strong, intelligent, kind, ambitious (+ many more adjectives) women could feel comfortable in the tech world and that there is indeed a place for us there after all.&lt;/p&gt;
&lt;p&gt;After the half-hour informal chat, I made my way along with the other code newbies and tutors into a room further to the back that had a projector screen and a number of round tables, dotted with chairs. I found a group of people I knew at a table, but all the chairs were taken. I went to sit on an empty table with someone else I knew. Here, we were both greeted by a man I hadn&#39;t met before. He sat between us, introduced himself as Jeremy, and said he&#39;d help by sharing his time between us. I began getting on with my &lt;a href=&quot;http://tutorials.codebar.io/html/lesson4/tutorial.html&quot;&gt;CSS tutorial&lt;/a&gt;. A little while in, the other student asked about hex codes.&lt;/p&gt;
&lt;p&gt;Busy with my tutorial, I was only half listening. About five minutes later, I realised Jeremy was still talking about hex codes and what&#39;s more, he seemed to be enjoying it. So, I began to listen properly. I really liked how in depth his knowledge was and that he was so happy to share it. After a few minutes, we moved onto a discussion about HTML and I asked Jeremy if he could recommend any tutorials or books to me. Without hesitation, he kindly offered to give me a book on the subject! He told me there were a few spare copies lying around. He returned with a small, thin orange book called &lt;a href=&quot;https://abookapart.com/products/html5-for-web-designers&quot;&gt;HTML 5 for Web Designers&lt;/a&gt;, which he handed to me. I was so busy thanking him that I didn&#39;t notice it was his book. He set me an HTML task based on the book, which I wrote down. Shortly after this, the session wrapped up for the evening.&lt;/p&gt;
&lt;p&gt;It wasn&#39;t until some months later that I was at a pub after a codebar session. It was cold, windy and wet outside. I remember it well. Sitting with me was a developer I had not previously met, &lt;a href=&quot;https://twitter.com/Lottejackson&quot;&gt;Charlotte&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/juliandoesstuff&quot;&gt;Julian&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/cassiecodes&quot;&gt;Cassie&lt;/a&gt;. All wonderful people. We were chatting happily and the conversation arrived at experience. It was then Charlotte told me that, If I liked, I could come along to her company, &lt;a href=&quot;https://clearleft.com/&quot;&gt;Clearleft&lt;/a&gt;, for a few hours of shadowing. I was very excited at the prospect and gladly accepted. It wasn&#39;t long before I&#39;d paid my first visit to Clearleft. This visit was amazing - I got to have one-on-one conversations with so many people, including the company&#39;s founders. I learned about how many different skill sets are needed in order to run a successful, innovative digital company. To my delight, I was invited back again. I spent a lot of my free time between long work hours coming to Clearleft to soak up the atmosphere and learn from the great staff.&lt;/p&gt;
&lt;p&gt;Each time I was there, I began to chat more and more with Jeremy. I found that his passion didn&#39;t stop at hex codes. He possesses a deep knowledge and enthusiasm for what makes the web tick, and what lies behind the scenes of what we see on the screen. He knows that in order to create a fair, robust web that is as true to its content as to its users, developers must respect where the web came from and what brought it to greatness in the first place. I easily learned more about this in my free time by listening to Jeremy&#39;s book &lt;a href=&quot;https://resilientwebdesign.com/&quot;&gt;Resilient Web Design&lt;/a&gt;, which is all about the history of the web.&lt;/p&gt;
&lt;p&gt;One day in January, I had spent a morning at Clearleft, and Jeremy decided to make me a really neat offer. He asked me whether I&#39;d like him to mentor me, but that I didn&#39;t have to take him up on the offer if it didn&#39;t sound like something I wanted. I was thrilled with the offer and gladly accepted, but was immediately worried that I&#39;d be taking up too much of his time. I asked him about this and he reassured me that although he had not offered to mentor someone before, it was something he wanted to try and to do right. I thanked him once again and over the next few weeks, we planned what the mentorship would look like. I came up with some things I&#39;d like to get out of it, which we discussed together. Jeremy blogged about these things, as well as how we came to be mentor and mentee, &lt;a href=&quot;https://adactio.com/journal/11923&quot;&gt;here&lt;/a&gt;. I am so grateful for his kind words and the offer of his time, and I am looking forward to working very hard and learning as much as I can! :-) Hooray!&lt;/p&gt;
&lt;p&gt;Also published on &lt;a rel=&quot;syndication&quot; class=&quot;u-syndication&quot; href=&quot;https://medium.com/@ambrwlsn90/tech-mentorship-e2e36464276c&quot;&gt;Medium&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Germany Trip</title>
      <link href="https://amberwilson.co.uk/blog/germanytrip/"/>
      <updated>Thu, 02 Mar 2017 24:00:00 GMT</updated>
      <id>https://amberwilson.co.uk/blog/germanytrip/</id>
      <content type="html">&lt;p&gt;An incredible time with wonderful friends ❤&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YDgJd3Xog2s&amp;amp;feature=youtu.be&quot;&gt;Click here for the video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-22&quot;&gt;22.02.17&lt;/time&gt; - Brighton Coach Station&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/beginning.jpg&quot; alt=&quot;Brighton Coach Station&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-23&quot;&gt;23.02.17&lt;/time&gt; - Cologne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/cologne.jpg&quot; alt=&quot;Cologne&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-23&quot;&gt;24.02.17&lt;/time&gt; - Essen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/essen.jpg&quot; alt=&quot;Essen&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-23&quot;&gt;25.02.17&lt;/time&gt; - Hannover&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/hannover.jpg&quot; alt=&quot;Hannover&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-26&quot;&gt;26.02.17&lt;/time&gt; - Bamberg&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/bamberg.jpg&quot; alt=&quot;Bamberg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;time datetime=&quot;2017-02-28&quot;&gt;28.02.17&lt;/time&gt; - Berlin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://amberwilson.co.uk/blog/germanytrip/img/berlin.jpg&quot; alt=&quot;Berlin&quot; /&gt;&lt;/p&gt;
</content>
    </entry>
</feed>