<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Albino Tonnina</title>
    <description>The latest articles on DEV Community by Albino Tonnina (@albinotonnina).</description>
    <link>https://dev.to/albinotonnina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F31302%2F11557d1b-13df-4822-837e-c047cdb149d4.jpg</url>
      <title>DEV Community: Albino Tonnina</title>
      <link>https://dev.to/albinotonnina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albinotonnina"/>
    <language>en</language>
    <item>
      <title>Rebuilding My Portfolio: A Week of React, Animations, and Testing</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Mon, 07 Jul 2025 15:04:37 +0000</pubDate>
      <link>https://dev.to/albinotonnina/rebuilding-my-portfolio-a-week-of-react-animations-and-testing-43hl</link>
      <guid>https://dev.to/albinotonnina/rebuilding-my-portfolio-a-week-of-react-animations-and-testing-43hl</guid>
      <description>&lt;p&gt;After years of inactivity, I decided it was time for a complete overhaul of my personal portfolio. What started as a simple "let me fix this one animation" turned into a week-long intensive refactoring session that transformed the entire codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 The Challenge
&lt;/h2&gt;

&lt;p&gt;My original portfolio stopped working because of many deprecated dependencies. The animation system was monolithic, testing was sparse, and adding new features felt like walking through a minefield.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What I Built
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Animation System Overhaul
&lt;/h3&gt;

&lt;p&gt;The biggest change was moving from a single, monolithic animation controller to a modular scene-based system. Each section of my journey (freelance → company → ASOS) now has its own self-contained scene with dedicated animations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: One massive animation controller&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;animateEverything&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 500+ lines of mixed concerns&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After: Modular scene management&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;deskScene&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./scenes/deskScene&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;spaceScene&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./scenes/spaceScene&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;contactsScene&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./scenes/contactsScene&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scenes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;desk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;deskScene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;spaceScene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;contactsScene&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Brand New Visuals and Interactions
&lt;/h3&gt;

&lt;p&gt;Each career chapter now tells a visual story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desk Scene&lt;/strong&gt;: My freelance days working from home&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space Scene&lt;/strong&gt;: The journey to London and ASOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contacts Scene&lt;/strong&gt;: Opening doors to new opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comprehensive Testing Infrastructure
&lt;/h3&gt;

&lt;p&gt;Testing animations is tricky, but I managed to achieve 90%+ coverage using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Testing animation state changes&lt;/span&gt;
&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should progress through scenes correctly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderHook&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;useAnimation&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

  &lt;span class="nf"&gt;act&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentScene&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;space&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom SVG Processing Pipeline
&lt;/h3&gt;

&lt;p&gt;I built a custom webpack plugin to optimize and process SVG animations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SVG ID processor for animation targeting&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SVGIdPlugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compiler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;compiler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tapAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SVGIdPlugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compilation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Process SVG files and assign unique IDs&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Technical Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; with hooks for state management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom animation system&lt;/strong&gt; using D3 interpolation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Testing Library&lt;/strong&gt; for component testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webpack 5&lt;/strong&gt; with custom loaders and plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESLint + Prettier + Stylelint&lt;/strong&gt; for code quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; for enhanced development workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📱 Performance Optimizations
&lt;/h2&gt;

&lt;p&gt;Mobile performance was crucial, especially for iOS Safari:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Viewport optimizations for iOS */&lt;/span&gt;
&lt;span class="nc"&gt;.animation-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translate3d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;will-change&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;backface-visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also implemented throttled scroll handlers and IntersectionObserver for efficient animation triggers.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Testing Complex Animations
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges was testing scroll-based animations. Here's how I approached it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Mock IntersectionObserver for testing&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mockIntersectionObserver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;mockIntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mockReturnValue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;unobserve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IntersectionObserver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mockIntersectionObserver&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎨 Animation Debugger
&lt;/h2&gt;

&lt;p&gt;I built a timeline debugger to visualize animation states during development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AnimationDebugger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;scenes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currentProgress&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;debug-timeline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;scenes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; 
        &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`scene-marker &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%`&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;))}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 Key Metrics
&lt;/h2&gt;

&lt;p&gt;After the refactor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;90%+ test coverage&lt;/strong&gt; (up from ~20%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular architecture&lt;/strong&gt; with 8 separate scene files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced mobile performance&lt;/strong&gt; with iOS-specific optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom tooling&lt;/strong&gt; for SVG processing and animation debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤔 Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Modular Architecture Pays Off
&lt;/h3&gt;

&lt;p&gt;Breaking the monolithic animation system into scenes made debugging and extending much easier. Each scene can be developed and tested in isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Testing Animations is Hard but Worth It
&lt;/h3&gt;

&lt;p&gt;Finding the right abstractions for testing scroll-based animations took time, but the confidence it provides is invaluable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Performance Matters on Mobile
&lt;/h3&gt;

&lt;p&gt;iOS Safari has specific quirks that required targeted optimizations. Always test on real devices!&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Developer Experience is Key
&lt;/h3&gt;

&lt;p&gt;The animation debugger and GitHub Copilot integration made the development process much more enjoyable and productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What's Next?
&lt;/h2&gt;

&lt;p&gt;The new modular system makes it easy to add new scenes and animations. I'm already planning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive scene selection&lt;/li&gt;
&lt;li&gt;More detailed micro-interactions&lt;/li&gt;
&lt;li&gt;Performance monitoring dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔗 Check It Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live site&lt;/strong&gt;: &lt;a href="https://albinotonnina.com" rel="noopener noreferrer"&gt;albinotonnina.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/albinotonnina/albinotonnina.com" rel="noopener noreferrer"&gt;github.com/albinotonnina/albinotonnina.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code is open source under CC BY-NC-ND 4.0 - feel free to explore and learn from it, but please don't use it as your own portfolio!&lt;/p&gt;




&lt;p&gt;What's your approach to portfolio development? Have you tackled similar animation challenges? I'd love to hear about your experiences in the comments! 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>animation</category>
      <category>testing</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>11 reasons why I love working from home</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Fri, 14 Aug 2020 07:37:35 +0000</pubDate>
      <link>https://dev.to/albinotonnina/11-reasons-why-i-love-working-from-home-195g</link>
      <guid>https://dev.to/albinotonnina/11-reasons-why-i-love-working-from-home-195g</guid>
      <description>&lt;p&gt;Here they are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can concentrate&lt;/strong&gt;. To perform at best, I need to get into the Zone. In an office I don't get into the Zone as much as I'd need to. I'd also need to see my colleagues from time to time because well, they are people I share a lot of time with. Let's meet regularly in the office to catch-up and socialize a bit?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can communicate better&lt;/strong&gt;. This may not apply to many. I am a non-native English speaker. Reading comments is easier to me. In online meetings I can concentrate on the voice of the speaker. I can even turn on live captions on some video conference services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Waking up is not stressful anymore&lt;/strong&gt;. I'm not a morning person, I do best later in the day, that's when the magic happen for me. My morning routine went from a 12 step process to a 3 steps process, wake up, prepare both mentally and phisically, work. I don't miss the lost extra steps, one of which is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commuting&lt;/strong&gt;. Some of you are happy to, I don't know, take a bike a cycle to work. Personally I see commuting as a daily loss of 2 very precious hours stuck in a too-full-to-be true set of n trains. With those two hours I now can:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do extra work if I want to&lt;/strong&gt;. I don't need to rush it, I don't need to prepare to leave the office. I can finish the bits I want to finish for the day, peacefully. Or...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spend more time with my family&lt;/strong&gt;. Play with my baby, watch her growing right in front of my eyes. See, on a daily basis, if I haven't been on 3 trains to rush home, I'm more calm, and more grateful, and more happy to help at home. Help my baby, help my wife. Or sometimes, I could even&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relax&lt;/strong&gt;. Yes, play a game, indulge in my hobbies some more. Or even better, go outside for a walk, maybe with the rest of family. Go for an ice cream with the&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Money&lt;/strong&gt; I saved. Cooking is cheaper than eating out, right? I'm also quite certain it's healthier. So I'm calmer, I can focus more and I eat better, I can now spend some money and time to&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix my house&lt;/strong&gt;! At 6 in the evening I'm not too tired to hang a picture or swap furniture around to see how it looks like. I can take 20 from work and go mount that new towel hanger in the bathroom I've been planning to fix for months. I would catch-up with work later! Or, instead of fixing something, one day I may need to&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take a nap mid day&lt;/strong&gt;. Uhhh. Some days it's 3 o'clock in the afternoon and my eyelids start getting heavier and heavier. In the office I usually soldier on, I try as much as I can to stay vigil. Well, I think nobody now will be hurt if I take a 30 min nap in my bedroom instad. A power nap, the ones that make you feel better after you had one. All of this really contributes to my&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mental Health&lt;/strong&gt;. So I don't see a reason why I should not be doing this in the foreseeable future. Leave comments about your experience if you want.&lt;/p&gt;

&lt;p&gt;Hello!&lt;br&gt;
My name is Albino Tonnina, I'm an italian web engineer in London.&lt;/p&gt;

&lt;p&gt;Cover image uncarefully screenshotted from my website: &lt;a href="https://www.albinotonnina.com"&gt;https://www.albinotonnina.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>work</category>
      <category>worklife</category>
      <category>wfh</category>
    </item>
    <item>
      <title>The most gratifying work I’ve ever done</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Mon, 03 Aug 2020 18:30:03 +0000</pubDate>
      <link>https://dev.to/albinotonnina/the-most-gratifying-work-i-ve-ever-done-35c7</link>
      <guid>https://dev.to/albinotonnina/the-most-gratifying-work-i-ve-ever-done-35c7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q3wtjjKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AS3MnHNcsLFuBuMv-KATIrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q3wtjjKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AS3MnHNcsLFuBuMv-KATIrg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  And the lessons I learned doing all the others
&lt;/h4&gt;

&lt;p&gt;I’ve been doing web development for more years than I would admit.&lt;/p&gt;

&lt;p&gt;Good projects, terrible projects, amazing projects, some I still remember, some I completely forgot about, I did them all.&lt;/p&gt;

&lt;p&gt;One in particular, a work I commissioned myself really, is the website I made in 2014 to make my skill set a bit more attractive and get a job abroad. What a pivotal moment in my life that was.&lt;/p&gt;

&lt;p&gt;It took around 3 weeks to be completed, 2 days to do the bulk, the rest to refine it.&lt;/p&gt;

&lt;p&gt;What I didn’t expect was this enormous amount of positive feedback I received, and still receive, for this work.&lt;/p&gt;

&lt;p&gt;That’s how it was in april 2014: &lt;a href="https://v1.albinotonnina.com/"&gt;https://v1.albinotonnina.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It must have been perhaps some novelty element in it (I like to call it a scrollytelly website), or the fact that I made it &lt;a href="https://github.com/albinotonnina/albinotonnina.com"&gt;open source on GitHub&lt;/a&gt; from the beginning. It did get attention.&lt;/p&gt;

&lt;p&gt;One or two months later I updated it with the news about my job search: &lt;a href="https://v2.albinotonnina.com/"&gt;https://v2.albinotonnina.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine my joy, landed in London, working for a prestigious tech company, &lt;em&gt;everything&lt;/em&gt; was absolutely new and inspiring.&lt;/p&gt;

&lt;p&gt;Time passed, the website did its part and that would have been it for me but people kept sending me these amazing messages!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ydzXqnH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ar35IZQZLVuTLNJtk7JIRUQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ydzXqnH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ar35IZQZLVuTLNJtk7JIRUQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I put together enough compliments to feed my ego for the decades to come but what made me really proud were those messages full of sentiment and soaked in inspired words, written by beginners, undergraduates, self taught folks who saw the website and had their passion for web development renewed and reinvigorated.&lt;/p&gt;

&lt;p&gt;That is why my website is &lt;em&gt;the most gratifying job I’ve ever made&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I decided not to let the website die and in 2017, with the benefit of a much improved skill set, I gave it a fresh coat of paint: &lt;a href="https://v3.albinotonnina.com/"&gt;https://v3.albinotonnina.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And 3 years later, August 2020, days ago, another coat: &lt;a href="https://albinotonnina.com/"&gt;https://www.albinotonnina.com&lt;/a&gt;, the current one&lt;/p&gt;

&lt;p&gt;If you asked me in 2017: “Do you have much more to learn?” you would have heard a silly answer. I couldn’t even imagine.&lt;/p&gt;

&lt;p&gt;In 2020 I’m wise enough to say that I will never end learning how to do this job.&lt;/p&gt;

&lt;p&gt;Nonetheless I did put together this little list of lessons I learned during my career as a web developer, since I get asked that often.&lt;/p&gt;

&lt;h4&gt;
  
  
  Here it goes:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The best skill a developer can have is persistence. This job involves solving a gazillion little problems, all the time. Sometimes you solve a problem just to create more of them. &lt;em&gt;Persistence&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If you feel down and not good enough, remember that there are no heroes here, everyone is probably doing their part just as you do.&lt;/li&gt;
&lt;li&gt;You will be wrong about something so many times. It’s OK.&lt;/li&gt;
&lt;li&gt;People know that &lt;em&gt;thing&lt;/em&gt; they know that you don’t know because they probably did that &lt;em&gt;thing&lt;/em&gt; repeatedly. You will know a lot about that &lt;em&gt;thing&lt;/em&gt;, as long as you really do that &lt;em&gt;repeatedly&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If it’s not coming out right, you could just start again. It’s amazing how much one can improve by starting to solve a problem from scratch once you know what you’re really dealing with. Sometimes you mess up and lose code and hours of work altogether. Consider the silver lining there. It really works for your personal improvement, it’s simple repetition.&lt;/li&gt;
&lt;li&gt;You cannot solve all the problems all together. Find your system, deal with the micro problems after you have dealt with the macro problems. It’s important to aim at organizing ourselves as much as possible to work in an orderly way.&lt;/li&gt;
&lt;li&gt;It’s never as hard as you think it is. Most of the time it’s just new jargon, it’s just a bit of darkness before the light. &lt;em&gt;Persist&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Don’t try to solve a problem at all costs. Sleep on it. Seriously, it works.&lt;/li&gt;
&lt;li&gt;Seniors are old juniors. The problems are the same, it’s the speed in solving them. A beginner dealing with a complex problem needs to read every sign on the sides of the road, an experienced developer did that trip a few times already. Simple muscle memory.&lt;/li&gt;
&lt;li&gt;Sometimes all you see in one day are error screens, error after error. &lt;em&gt;Persistence&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Don’t rush it. Review your work with a cold mind before you publish anything.&lt;/li&gt;
&lt;li&gt;Ask for early feedback, you reached a milestone in your current project? Show it and listen carefully at the feedback.&lt;/li&gt;
&lt;li&gt;When you get the feedback, accept and understand it. Feedbacks are precious material, it’s the lenses to look at your work that you cannot possess.&lt;/li&gt;
&lt;li&gt;Learn how to filter out info when you are briefed for a new piece of work. Unfiltered data is overwhelming for everyone. Don’t assume you’re getting briefed correctly, if you get lost &lt;em&gt;most probably&lt;/em&gt; it’s not you. It’s bad info. Ask for clarification everytime you need it. It’s so worth it.&lt;/li&gt;
&lt;li&gt;Never criticize the code you’re about to work on unless you are very aware of the circumstances and the context that code has been written.&lt;/li&gt;
&lt;li&gt;I search on Google or Stack Overflow all the time. For 2 reasons: I don’t have a good memory and I want to check if someone came out with new and better solutions than the ones I already know.&lt;/li&gt;
&lt;li&gt;Eagerly learn your keyboard shortcuts. It also makes you look cooler. Really, it helps keep you focused while working.&lt;/li&gt;
&lt;li&gt;With time your project’s code should get simpler and simpler. If your code starts to look like the one you see in the movies, abort. And restart.&lt;/li&gt;
&lt;li&gt;Reached a little milestone? Accomplished a bit? You like what you see? Save it. SAVE IT. Save it and commit. I repeat, save it and commit.&lt;/li&gt;
&lt;li&gt;Commit all the time. Not sure I mentioned that already.&lt;/li&gt;
&lt;li&gt;The job of removing code while refactoring your work in progress should be one of the best moments of your working day.&lt;/li&gt;
&lt;li&gt;Get closer to the metal. Or at least tend to. The more you do, the more you understand the why of the surface layers. Go straight to mdn (for web), instead of stackoverflow. Dig deeper.&lt;/li&gt;
&lt;li&gt;Your first iteration is most probably poor. Add your tests now, then refactor your code.&lt;/li&gt;
&lt;li&gt;’cause you do test your code, right? Test all the things. Want confidence in your code? Be good at writing your tests. There is no better other way.&lt;/li&gt;
&lt;li&gt;If your code stops working all of a sudden, nothing works, then it’s probably a very tiny change somewhere. Did you commit last time you liked it? Did you write your tests? Good, it’s now easy to see where that tiny little insidious bug is.&lt;/li&gt;
&lt;li&gt;Have a storyboard of some kind when you start something new. You won’t necessarily follow it but at least you won’t get lost easily. Very important when you work on multiple projects and need to switch context often.&lt;/li&gt;
&lt;li&gt;But try not to switch context often. If you have work coming from all sides make clear that you will be concentrating on one piece of work at a time.&lt;/li&gt;
&lt;li&gt;Working in parallel may be very unproductive. You wouldn’t feed your baby while trying tightrope walking.&lt;/li&gt;
&lt;li&gt;Never skip the documentation of a software. You’ll regret you didn’t check the docs first.&lt;/li&gt;
&lt;li&gt;If you solve a problem by mistake, counterintuitively it’s usually bad. You may have created more problems. Be sure about everything. Easy if you have written your tests!&lt;/li&gt;
&lt;li&gt;Don’t try to sneak in bad code in the projects you work on, it will always, &lt;em&gt;always&lt;/em&gt;, come back to bite you in the behind.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thank you for taking the time to read this. I’ll be seeing you in 3 years with a new version of this website :)&lt;/p&gt;

&lt;h3&gt;
  
  
  My latest articles
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/how-to-lose-an-it-job-in-10-minutes-3d63213c8370"&gt;How to Lose an IT Job in 10 Minutes&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://medium.com/@albinotonnina/magic-hat-technique-408a3fa590bb"&gt;Speaking of web layouts…introducing the Magic Hat technique 🎩✨&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://medium.com/free-code-camp/designers-are-from-saturn-developers-are-from-jupiter-or-why-communication-matters-7d91794e5a37"&gt;Designers are from Saturn, developers are from Jupiter: or, why communication matters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://twitter.com/albinotonnina"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/albinotonnina/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>developer</category>
      <category>webdev</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>Do you want a Design System at ACME inc?</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Wed, 13 Mar 2019 20:28:42 +0000</pubDate>
      <link>https://dev.to/albinotonnina/do-we-want-a-design-system-at-acme-inc-4ak9</link>
      <guid>https://dev.to/albinotonnina/do-we-want-a-design-system-at-acme-inc-4ak9</guid>
      <description>&lt;h2&gt;
  
  
  If yes, that’s how I would make it happen
&lt;/h2&gt;

&lt;p&gt;In general, a Design System could be loosely defined as &lt;em&gt;a system built to serve teams, to develop and ship features more efficiently to form a more cohesive customer journey across all the applications.Ecosystem quality through consistency.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Product development is our core business. In our world, our software is in a perpetual state of evolution.&lt;/p&gt;

&lt;p&gt;Features are added constantly, while our backlog keeps being fed with corrections and updates. The resources are not infinite, engineers and product designers are constantly busy following the roadmaps.&lt;/p&gt;

&lt;p&gt;How do we think we will be able to build even another product such as a Design System when we are already almost buried with features to build? &lt;strong&gt;We don’t have enough resources or time&lt;/strong&gt;. We have many &lt;strong&gt;features&lt;/strong&gt; waiting to be built. We cannot stop the Machine to build and implement a Design System now.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cohesiveness IS a feature
&lt;/h4&gt;

&lt;p&gt;The ultimate goal of our Product Design department is to achieve a Unified User Experience across all our Products. It is important for our business. It’s what the market wants, it’s what customers want, it’s what every employee of the company wants. Guaranteed.&lt;/p&gt;

&lt;p&gt;Design Systems has essentially that purpose, to offer a consistent user experience across products. It does it by consolidating a visual language amongst other responsibilities. Maybe your company has already a visual language built by the Design teams although the lack of a system that connects it with developers lead to problems during the development. Also distributed teams and remote offices could interfere by adding some more obstacles to the process. Design Systems promise cohesiveness as the main outcome.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Designers will be definitely happier and more engaged. Designers hate inconsistencies.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  We will deliver features quicker
&lt;/h4&gt;

&lt;p&gt;A Design System produces a UI component library and UX patterns. It’s the result of the communication between Designers and Developers through the system’s shared language.&lt;/p&gt;

&lt;p&gt;Product Design and Engineering could benefit enormously from this outcome. &lt;strong&gt;Product teams will speed up gradually&lt;/strong&gt; to a new level by ceding small solutions to a shared effort.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PMs will definitely like this.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  We will produce better code
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Engineers will worry less&lt;/strong&gt; about the concerns related to the UI aspect of the products and concentrate more on the business logic. And Engineers in general hate that part of the job anyway.&lt;/p&gt;

&lt;p&gt;Less time spent on fixing a layout also has the potential of making the process of visual QA much smoother and lean: having an autonomously tested and controlled UI library guarantees automatically the integrity of the UI.&lt;/p&gt;

&lt;p&gt;The Component library also helps our software to be more modular and scalable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Developers would love this.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Will produce less documentation
&lt;/h4&gt;

&lt;p&gt;Shared languages, shared practices, they all help in making the documentation needed for each feature lean and smart.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Who likes to read documentation anyway?&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Everyone will participate
&lt;/h4&gt;

&lt;p&gt;Here’s a great thing about Design Systems, they are great for collaboration. &lt;strong&gt;Everyone is called to participate&lt;/strong&gt;. From departments to teams, to individuals.&lt;/p&gt;

&lt;p&gt;Every engineer and every designer will be naturally exposed to the UI library in their daily job so the familiarity with it could encourage knowledge sharing and engagement. This is good in our world, given the high turnover and basically &lt;strong&gt;never enough time&lt;/strong&gt; to do onboarding.&lt;/p&gt;

&lt;h4&gt;
  
  
  It will increase our reputation as a Company
&lt;/h4&gt;

&lt;p&gt;We will hear about Design Systems more and more in the future, as companies are improving a lot towards the goal of having user-centered products and lean processes in the development.&lt;/p&gt;

&lt;p&gt;This will help to &lt;strong&gt;attract talented professionals&lt;/strong&gt; that are naturally inclined to stay updated with the latest cutting edge technologies.&lt;/p&gt;

&lt;p&gt;We could also attract them by sharing the experience of building a Design System through articles and presentations.&lt;/p&gt;

&lt;h3&gt;
  
  
  It sounds interesting, now estimate
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A Design System is a living, funded product with a roadmap &amp;amp; backlog, serving a larger ecosystem in order to achieve a Unified User Experience.&lt;/em&gt; &lt;a href="https://twitter.com/nathanacurtis" rel="noopener noreferrer"&gt;Nathan Curtis&lt;/a&gt;, &lt;a href="http://eightshapes.com/nathan-curtis.html" rel="noopener noreferrer"&gt;EightShapes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  We need a multidisciplinary committed team
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkwsuu5sfopxguzbvgh6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkwsuu5sfopxguzbvgh6i.png" alt="A common configuration of a team dedicated to the Design System"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A product needs a team. All members are committed at half-time capacity or less, otherwise remaining committed to the other products. The members of the team can rotate/mutate on a per need basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams won’t work alone.&lt;/strong&gt; Their job is to involve teams working on products when needed. &lt;strong&gt;Think of the system’s team as both builders and researchers&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  We need a roadmap
&lt;/h4&gt;

&lt;p&gt;A roadmap reveals a System’s direction.&lt;/p&gt;

&lt;p&gt;It enables a design system team to convey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;commitment&lt;/strong&gt; to delivering value, justifying their well-defined funding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;transparent priorities&lt;/strong&gt;, especially critical when serving products and
platforms with divergent interests&lt;/li&gt;
&lt;li&gt;reliable &lt;strong&gt;cadence&lt;/strong&gt; that customers depend on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Roadmaps highlight the most important elements of each release, charting the system’s direction without drowning in detail. Organizing that simple story into a a milestone based, columnar roadmap format works wonders.&lt;/p&gt;

&lt;p&gt;One of the first assignments of the Design System team will be the definition of a rough, open to modification/extension, prioritized list of tasks. &lt;/p&gt;

&lt;p&gt;A responsibility of the team during the execution of this important task will be engaging with the other teams and individuals that contribute to the development of our products.&lt;/p&gt;

&lt;h4&gt;
  
  
  We need a workflow to design and build components
&lt;/h4&gt;

&lt;p&gt;The System’s team will make most features — visual style, UI components, documentation tooling, UX patterns, and more — by following simple, identified steps of &lt;strong&gt;discover&lt;/strong&gt;, &lt;strong&gt;design&lt;/strong&gt;, &lt;strong&gt;build&lt;/strong&gt;, &lt;strong&gt;documentation&lt;/strong&gt;, and &lt;strong&gt;publish&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A defined workflow helps a team mutually understand the scope, reviewers, tools, and the definition of done at each step. With a workflow, collaboration tightens, delivery quickens, and the team predictably delivers features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvtx1uniq0c2ev6jnurz8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fvtx1uniq0c2ev6jnurz8.png" alt="Example workflow."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A QA checklist is also essential. Visual quality, functionality, compatibility are parts of the checklist.&lt;/p&gt;

&lt;h4&gt;
  
  
  We need a release strategy
&lt;/h4&gt;

&lt;p&gt;It could be quarters, it could be sprints.&lt;/p&gt;

&lt;p&gt;The system team will deliver an initial library that can be adopted by a predictable time. Work initially to launch a &lt;code&gt;1.0&lt;/code&gt; that delivers a strong visual foundation and 12 to 16 UI components.&lt;/p&gt;

&lt;p&gt;Those components will be the tools that designers will use to build the experiences. Developers will do the same having those parts ready to be implemented in their codebases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After 1.0, we need an adoption strategy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The modular nature of the system let the teams adopt it in bits, gradually. We can identify which product could be our beta tester, for example. Or start implement the system incrementally on every product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We need to wait 1.0 to start adopting the system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With fast release cycles or continuous integration, it just sounds right to use the time spent on features to gradually build the library, basically while we go.&lt;/p&gt;

&lt;p&gt;I see a problem with this approach. Unlike a feature-based release, I think that a Design System has the duty to be a language with an already established grammar and vocabulary even in the early adoption phases. Letters (components) must combine in infinite meaningful ways (interfaces) so then we can build meaningful sentences (products) with them. The language (system) is created and ready to be used.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Having/maintaining a Design Systems is proving a good choice in more and more companies. I think a Design System would be an important and invaluable product in your company. It won’t produce features by itself but it will serve the other products. It will have a cost at the beginning and no tangible returns, yes, in theory. Practically I see benefits from day one: &lt;strong&gt;Design and Engineering in the same room&lt;/strong&gt; producing the product that will allow them to speak one common language.&lt;/p&gt;

&lt;h3&gt;
  
  
  I didn't write this very recently.
&lt;/h3&gt;

&lt;p&gt;This article was in my drafts section since 2017. Do you think it's still relevant? Let me know!&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank you for reading
&lt;/h3&gt;

&lt;p&gt;Do you have positive experiences to share?&lt;/p&gt;

&lt;p&gt;Hello, my name is Albino Tonnina, I’m a Software Engineer who works in London, you can find me on &lt;a href="https://twitter.com/albinotonnina" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/albinotonnina" rel="noopener noreferrer"&gt;Github&lt;/a&gt; or &lt;a href="https://www.instagram.com/albino_tonnina/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or around the city.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  My latest articles
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/how-to-lose-an-it-job-in-10-minutes-3d63213c8370" rel="noopener noreferrer"&gt;How to Lose an IT Job in 10 Minutes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@albinotonnina/magic-hat-technique-408a3fa590bb" rel="noopener noreferrer"&gt;Speaking of web layouts…introducing the Magic Hat technique 🎩✨&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/albinotonnina/designers-are-from-saturn-developers-are-fromjupiter-3a2n"&gt;Designers are from Saturn, Developers are from Jupiter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://twitter.com/albinotonnina" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/albinotonnina" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>css</category>
    </item>
    <item>
      <title>Designers are from Saturn, Developers are from Jupiter</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Fri, 10 Aug 2018 20:14:07 +0000</pubDate>
      <link>https://dev.to/albinotonnina/designers-are-from-saturn-developers-are-fromjupiter-3a2n</link>
      <guid>https://dev.to/albinotonnina/designers-are-from-saturn-developers-are-fromjupiter-3a2n</guid>
      <description>&lt;h3&gt;
  
  
  About the ‘But it looks different on the Specs’ effect, UI Toolkits and other stuff.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2YdojSg6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A8fAGPEkr7UAqhNf0z3T5Zg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2YdojSg6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A8fAGPEkr7UAqhNf0z3T5Zg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two planets but at least the same Solar &lt;strong&gt;System!&lt;/strong&gt; And that’s the end of the analogy with planets.&lt;/p&gt;

&lt;h4&gt;
  
  
  Allergy Advice
&lt;/h4&gt;

&lt;p&gt;This is an article about &lt;a href="https://www.uxpin.com/studio/blog/design-systems-vs-pattern-libraries-vs-style-guides-whats-difference/"&gt;Design Systems&lt;/a&gt;, particularly on the topic of UI Toolkits and the dynamics of the communication between Designers and Developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designers&lt;/strong&gt;, something tells me that you know about Design Systems and that you may dig them :) In case you want to read more, Nathan Curtis wrote a lot about it. I do love and respect his &lt;a href="https://medium.com/eightshapes-llc/tagged/design-systems"&gt;work on Design Systems&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers&lt;/strong&gt;, I’m going to show some code at the end. The playground is a React + CSS-in-JS library (such as emotion or styled-components) app.&lt;/p&gt;

&lt;h3&gt;
  
  
  A kind of a typical scenario
&lt;/h3&gt;

&lt;p&gt;Our Designer produced a series of nice designs, including the layout of our *Documents *page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mY61vmQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2Ak0iI0xz1Qls-w1vT-PwWLw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mY61vmQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2Ak0iI0xz1Qls-w1vT-PwWLw.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;&lt;a href="https://www.sketchappsources.com/free-source/2576-ooto-productivity-dashboards-sketch-freebie-resource.html"&gt;https://www.sketchappsources.com/free-source/2576-ooto-productivity-dashboards-sketch-freebie-resource.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;It’s clean, it’s balanced, it’s kinda pleasing to the eye. For the Designers, this is the culmination of a &lt;strong&gt;long process&lt;/strong&gt;, a whole series of tasks involving researching, interviewing, think-ing, review-ing, rethink-ing, white-board-ing, prototyp-ing, wirefram-ing. A fu*k-ing long and tedious process that often Developers are not exposed to.&lt;/p&gt;

&lt;p&gt;How did Designers produce this image anyway? &lt;br&gt; They probably used a &lt;strong&gt;design toolkit&lt;/strong&gt;. A very popular one is &lt;a href="https://www.sketchapp.com/"&gt;Sketch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alas&lt;/strong&gt;, the way this software works is diametrically opposed to the way Developers work. &lt;strong&gt;And I say that’s the crux of our matter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Designers need tools that let them re-iterate quickly, reviewing and updating, feedback after feedback, stakeholder meeting after the other. *&lt;em&gt;Designers need tools like Sketch. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/emqXnYodLaS4M/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/emqXnYodLaS4M/giphy.gif" width="90%"&gt;&lt;/a&gt;&lt;br&gt;
img: Designing for stakeholders.&lt;/p&gt;

&lt;h4&gt;
  
  
  Developers, on the other hand, work differently.
&lt;/h4&gt;

&lt;p&gt;They works on &lt;strong&gt;ever-changing codebases&lt;/strong&gt; that at any point in time must produce a working release of an application. It takes effort to implement a layout like the one in our example, designing, abstracting, implementing, refactoring, testing, reviewing, refactoring, bug fixing, refactoring. Developers need to make sure they don’t break anything else or pollute the codebase with &lt;strong&gt;bad, duplicated code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/shXBoJHIx6Lni/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/shXBoJHIx6Lni/giphy.gif" width="90%"&gt;&lt;/a&gt;&lt;br&gt;
img: Developers&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Designers are more like jumping backwards and forwards where Developers work in a continuous loop of development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  The Visual Spec file
&lt;/h4&gt;

&lt;p&gt;Now it’s time for Designers to communicate with Developers, &lt;em&gt;hand off the baton.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are layouts, spaces and colors and so on to be documented. Sketch or any other tool doesn’t know much about your current codebase, your file structure, your abstraction, so what Sketch can do? Measure things. And that’s what will be produced:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JpLrti0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2At8K0NcmFdWBkCTalH92aVw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JpLrti0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2At8K0NcmFdWBkCTalH92aVw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/i8tV2kJB8Gig8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/i8tV2kJB8Gig8/giphy.gif" width="90%"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;img: Developers with mixed feelings about the spec file.&lt;/p&gt;

&lt;h3&gt;
  
  
  A few days go by…
&lt;/h3&gt;

&lt;p&gt;Stuff is ready and Designers have the first look at it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iWldHfSE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AOp-Fmt6HD_onew7zktxn9Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iWldHfSE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AOp-Fmt6HD_onew7zktxn9Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/y1WDIwAZRSmru/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/y1WDIwAZRSmru/giphy.gif" width="90%"&gt;&lt;/a&gt;&lt;br&gt;
img: Designers with mixed feelings about the final result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frustrated Designers, frustrated Developers.
&lt;/h3&gt;

&lt;p&gt;That’s the moment when the enchantment is really broken. &lt;strong&gt;The Spec file&lt;/strong&gt;. Little issues with color, spacing, typography, layout, miscommunicated details, missing behaviours.&lt;/p&gt;

&lt;p&gt;Developers will have to interpret and adapt the specs to their own system in the codebase on the fly when they should just worry about implementing the business logic of the new feature. Designers are not to blame though, they may simply not know about such system.&lt;/p&gt;

&lt;p&gt;My grandpa used to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When Designers and Developers don’t communicate well, get a Design System with a&lt;br&gt;
well shared and communicated set of tools, abstractions and constrains.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  You need a good UI Toolkit
&lt;/h3&gt;

&lt;p&gt;It’s through a shared system that Designers and Developers can really &lt;strong&gt;communicate effectively&lt;/strong&gt; without stress. A UI Toolkit aims to &lt;strong&gt;reinforce&lt;/strong&gt; the principles documented in a Design System. It is governed by a &lt;strong&gt;highly shared and documented&lt;/strong&gt; set of conventions, UI patterns, behaviours, designed, tested and agreed by everyone. &lt;em&gt;It’s where Designers and Developers efforts meet.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why you really need a good UI Toolkit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Is your app getting increasingly more complex?&lt;/li&gt;
&lt;li&gt;Designers are talking quite a lot about insconsistencies on the app?&lt;/li&gt;
&lt;li&gt;CI/CD? Going fast fast fast?&lt;/li&gt;
&lt;li&gt;Remote teams?&lt;/li&gt;
&lt;li&gt;Getting a bit messy with those CSS files?&lt;/li&gt;
&lt;li&gt;Starting to care about the size of the app?&lt;/li&gt;
&lt;li&gt;Is the User Experience at the core of your business model?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to tick all the checks, even one may be enough :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Why you need Your Own UI Toolkit
&lt;/h3&gt;

&lt;p&gt;A Design System is all about the &lt;strong&gt;Language&lt;/strong&gt;. Visual language, UI Design language, etc. &lt;strong&gt;It takes a lot of effort to define your own&lt;/strong&gt;: Product, Design, Engineering, all these departments will be heavily involved.&lt;/p&gt;

&lt;p&gt;A lot of times that’s just &lt;strong&gt;not a viable option&lt;/strong&gt;. There are amazing frameworks out there, &lt;a href="https://react.semantic-ui.com/"&gt;semantic-ui&lt;/a&gt;, &lt;a href="https://ant.design/"&gt;ant-design&lt;/a&gt;,&lt;a href="https://getbootstrap.com/docs/4.1/getting-started/introduction/"&gt;Bootstrap&lt;/a&gt;, &lt;a href="https://material-ui.com/"&gt;Material-UI&lt;/a&gt;. They all come with a sort of &lt;em&gt;pre-made&lt;/em&gt; Language and a &lt;strong&gt;battle-tested UI Toolkit&lt;/strong&gt;, ready for you to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch?&lt;/strong&gt; My opinion? Soon enough they won’t fit you anymore. &lt;strong&gt;You will want to evade from it.&lt;/strong&gt; Besides, the UI toolkit are probably so engineered to be hard to control. Remember that those frameworks are made to pass countless cases, maybe more than what you need. Plus, this &lt;strong&gt;extra complexity is paid in kb&lt;/strong&gt; as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Steal as an artist
&lt;/h4&gt;

&lt;p&gt;Do not adopt a UI Toolkit. Copy from others instead, and by that I mean take the bits that fits you the most and implement them** from scratch**. It’s now common for highly user centric companies to have their own Design System, many of them open sourced!&lt;/p&gt;

&lt;p&gt;Look at this list of Design Systems:&lt;br&gt;
&lt;a href="https://adele.uxpin.com/"&gt;https://adele.uxpin.com&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BBC: &lt;a href="http://www.bbc.co.uk/gel"&gt;Gel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trello: &lt;a href="https://design.trello.com/"&gt;Nachos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Salesforce: &lt;a href="https://www.lightningdesignsystem.com/"&gt;Lightning&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and dozens more. And in the end it’s all a matter of designing and delivering this &lt;strong&gt;together&lt;/strong&gt;. It’s about &lt;strong&gt;building something specific for your domain&lt;/strong&gt;, also &lt;strong&gt;unique&lt;/strong&gt; and representative of your &lt;strong&gt;brand&lt;/strong&gt;. It’s rewarding and you get to give it a nice name too :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Let’s make one
&lt;/h3&gt;

&lt;p&gt;I’m gonna show you how easy it is to bootstrap our own Design System.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m gonna call it &lt;strong&gt;Larry&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s take a little portion of our layout and try to build it from scratch:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6SgDfIG6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ACtk5K5_2twIWj8JBx2KrGw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6SgDfIG6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ACtk5K5_2twIWj8JBx2KrGw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  End result first
&lt;/h3&gt;

&lt;p&gt;The following CodeSandbox is the one and only app in the world that implements &lt;strong&gt;Larry:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/github/albinotonnina/larry/tree/master/?module=%2Fsrc%2Fdesign-system%2Fconstants%2Findex.js"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pzpI10jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codesandbox.io/static/img/play-codesandbox.svg" alt="Edit larry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find &lt;strong&gt;Larry&lt;/strong&gt; on &lt;strong&gt;GitHub&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://github.com/albinotonnina/larry"&gt;https://github.com/albinotonnina/larry&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Documentation
&lt;/h3&gt;

&lt;p&gt;This bit is the most important. Who is in charge of this, maybe Designers? Well typically yes but trust me on this, you should be both equally involved in documenting your Language. &lt;strong&gt;You should both agree on literally everything here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s start defining some really basic conventions:&lt;/p&gt;

&lt;h4&gt;
  
  
  Colors
&lt;/h4&gt;

&lt;p&gt;Let’s generate a palette for our layout.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Axz8XxaS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AKqcQkVqdJBKSuS7loVd7Yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Axz8XxaS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AKqcQkVqdJBKSuS7loVd7Yw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I suggest to define a series of semantic names from these colors, like so:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;headerText&lt;/strong&gt; = JapaneseIndigo&lt;br&gt; &lt;strong&gt;paragraphText&lt;/strong&gt; = JapaneseIndigo&lt;br&gt;&lt;br&gt;
&lt;strong&gt;elementBackgroundDefault&lt;/strong&gt; = Snow&lt;br&gt; &lt;strong&gt;elementBackgroundHover&lt;/strong&gt; =&lt;br&gt;
BrilliantAzure&lt;br&gt; &lt;strong&gt;elementButton&lt;/strong&gt; = LightGray — alpha 60%&lt;/p&gt;

&lt;p&gt;These are the names &lt;strong&gt;you’re both gonna use when&lt;/strong&gt; *&lt;em&gt;speccing *&lt;/em&gt;(which is a word).&lt;/p&gt;

&lt;h4&gt;
  
  
  Spacing
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Pay extra attention to spacing.&lt;/strong&gt; Without a clear strategy for spacing things can go really wrong.&lt;/p&gt;

&lt;p&gt;Define and agree on a spacing system, for example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aoJANOx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A8vWeubT5wjJs-cOQHf7cNQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aoJANOx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A8vWeubT5wjJs-cOQHf7cNQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A spec file would look like this:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tUvkvgdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AwopFDrMRdrdLlPv-XMO6Zw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tUvkvgdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AwopFDrMRdrdLlPv-XMO6Zw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Typography
&lt;/h4&gt;

&lt;p&gt;Make sure that font-sizes, font-weights, line-heights, margins, colors in your headings, your paragraphs etc just match. Call them with names you like, eg. HeaderHuge, HeaderLarge, HeaderTiny or use semantic tags (h1, h2, h3) properly. Just &lt;strong&gt;make sure you are aligned on this&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Patterns
&lt;/h4&gt;

&lt;p&gt;What rhymes with UI Toolkit? &lt;strong&gt;Pattern library&lt;/strong&gt;! You need to start populating your library of patterns. What you want is to have the components that you need to behave the way you agreed so you can compose them the way you want, anytime you want.&lt;/p&gt;

&lt;p&gt;Start from the &lt;strong&gt;particles&lt;/strong&gt;, &lt;strong&gt;primitives&lt;/strong&gt; such a Box component, for when you have to set spacings and borders around something else.&lt;/p&gt;

&lt;p&gt;Add &lt;strong&gt;more specialised new particles&lt;/strong&gt;, such as a Text component or a Flex component, which you could imagine as a Box component + some flex utilities.&lt;/p&gt;

&lt;p&gt;See them as particles that live in isolation, not aware of the context in which they will be used and of the space that should exist around them.&lt;/p&gt;

&lt;p&gt;Continue with more complex UI Components, compositions of other smallest components and so on.&lt;/p&gt;

&lt;p&gt;What’s important here is not the technology or which kind of abstractions in your documentation. What’s important is that you do this &lt;strong&gt;together&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtycVXEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AYYrdHo0lKQrNkVZQ9W7D_g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtycVXEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AYYrdHo0lKQrNkVZQ9W7D_g.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;Example of a more complex UI Component&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  You got the gist?
&lt;/h3&gt;

&lt;p&gt;You have defined constants and you have some particles to build.&lt;/p&gt;

&lt;p&gt;You will reiterate over this particles and extend the library pretty quickly, so embrace and prepare for elasticity. Developers, you don’t want Designers to &lt;em&gt;finish *documenting the entire System before starting to implement the code. **You have to do this thing together or it won’t just take off.&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;So, Designers and Developers,** **straight after the article **go make your own Larry **if you don’t have one!&lt;/p&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;p&gt;You have &lt;a href="https://github.com/albinotonnina/larry"&gt;a copy of Larry&lt;/a&gt;, you can clone and play with it. Your Larry may be different or you may be using different frameworks so I’m going to go through the key points of this approach.&lt;/p&gt;

&lt;h4&gt;
  
  
  Theme, define the constants
&lt;/h4&gt;

&lt;p&gt;It’s an object with our theme constants, so spaces definitions, colors, fonts, typography, breakpoints, anything. Here’s &lt;a href="https://github.com/albinotonnina/larry/blob/master/src/design-system/constants/index.js"&gt;Larry’s theme&lt;/a&gt;, and here’s a sample version of it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Oa9Y3oCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ActftgBakeNeruWAQdJArfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Oa9Y3oCR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ActftgBakeNeruWAQdJArfw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s no limit to the complexity/completeness you can achieve here, after all it’s a matter of generating a JavaScript object, just imagine what you could do!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o69uYdgL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ARjRcYjLRD5haC8DDgQYKrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o69uYdgL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ARjRcYjLRD5haC8DDgQYKrw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a core file. &lt;strong&gt;Every color, margin or padding, font-size or font-weight or breakpoint must come from here and only from here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSS-in_JS libraries are amazing tools, &lt;a href="https://github.com/jxnblk/styled-system"&gt;styled-system&lt;/a&gt; makes them even better. It’s a set of utilities for Design Systems and consist of functions that take &lt;code&gt;props&lt;/code&gt; as an argument and return style objects, while making it simpler to use values from a theme and apply styles responsively across breakpoints.&lt;/p&gt;

&lt;p&gt;This approach take advantage of this utilities, feel free to evaluate it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Plug the theme into your app
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/emotion-theming"&gt;Provide those constants to your app&lt;/a&gt;: every component in the app will have access to our theme constants.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QUG9E7AL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A6M6Q9zuKzNlcWPphfUI9ww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QUG9E7AL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A6M6Q9zuKzNlcWPphfUI9ww.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Create basic UI Components
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fSWWdGl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A1eIZb7yNcdppncpoj5fCLw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fSWWdGl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A1eIZb7yNcdppncpoj5fCLw.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;a primitive Box UI Component&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  More specialised UI components
&lt;/h4&gt;

&lt;p&gt;Here’s a Flex component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b-eUHsBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2Akd_s4cbWxxqcJTlC2N04fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b-eUHsBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2Akd_s4cbWxxqcJTlC2N04fw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Implement UI components in your feature files
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---vwD6T4a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AqSxzGojmAS-vfB3LTkZctw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---vwD6T4a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AqSxzGojmAS-vfB3LTkZctw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Time to render something
&lt;/h4&gt;

&lt;p&gt;This is where you implement your UI Component and your business logic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ar2azXSM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A5vObQKvSpUX9engeMaNX6A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ar2azXSM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A5vObQKvSpUX9engeMaNX6A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The files structure
&lt;/h3&gt;

&lt;p&gt;This is Larry’s file structure. I don’t have strong opinions on file structures, actually I believe in something different: move around your files until you feel comfortable with them.&lt;/p&gt;

&lt;p&gt;Larry is all into a “**design-system” **folder, this is where you can find its constants and generic and reusable UI components.&lt;/p&gt;

&lt;p&gt;Notice also the UI folder into the Document layout folder, that’s where I define and export the UI components specific for our feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--At4H4xVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AeN6vUZcqCJfmHMdVmKu5EQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--At4H4xVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AeN6vUZcqCJfmHMdVmKu5EQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;With large and complex apps, it’s never easy to keep the UI consistent and cohesive. Design Systems help. Custom Design Systems and tailored UI Toolkit really help.&lt;/p&gt;

&lt;p&gt;Designers and Developers may have very different approaches to the same problem but that doesn’t mean that they cannot communicate effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nati_4Yt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ALRjLAzWqaLiYl4N5DZH8Kg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nati_4Yt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ALRjLAzWqaLiYl4N5DZH8Kg.gif" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;&lt;a href="https://dribbble.com/shots/2712522-Designer-vs-Developer"&gt;https://dribbble.com/shots/2712522-Designer-vs-Developer&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank you for reading
&lt;/h3&gt;

&lt;p&gt;Do you have positive experiences to share?&lt;/p&gt;

&lt;p&gt;Hello, my name is Albino Tonnina, I’m a Software Engineer who works in London, you can find me on &lt;a href="https://twitter.com/albinotonnina"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/albinotonnina"&gt;Github&lt;/a&gt; or &lt;a href="https://www.instagram.com/albino_tonnina/"&gt;Instagram&lt;/a&gt; or around the city.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zaEYIvVl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2Andz2zpAwq7qvQhhQI0ieLQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zaEYIvVl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2Andz2zpAwq7qvQhhQI0ieLQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My latest articles
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/how-to-lose-an-it-job-in-10-minutes-3d63213c8370"&gt;How to Lose an IT Job in 10 Minutes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@albinotonnina/magic-hat-technique-408a3fa590bb"&gt;Speaking of web layouts…introducing the Magic Hat technique 🎩✨&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://twitter.com/albinotonnina"&gt;Twitter&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>css</category>
      <category>react</category>
    </item>
    <item>
      <title>How to lose a Job in 10 minutes</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Tue, 12 Jun 2018 17:05:37 +0000</pubDate>
      <link>https://dev.to/albinotonnina/how-to-lose-a-it-job-in-10-minutes-35pi</link>
      <guid>https://dev.to/albinotonnina/how-to-lose-a-it-job-in-10-minutes-35pi</guid>
      <description>&lt;h4&gt;
  
  
  Whiteboard coding interviews can cost you a job
&lt;/h4&gt;

&lt;p&gt;Recently I’ve been quite close to getting a job at one of the &lt;a href="https://hackernoon.com/famga-what-we-learned-in-2016-from-the-5-big-mega-cap-tech-companies-39ca2edfe8a1" rel="noopener noreferrer"&gt;Big 5&lt;/a&gt;. I went through the screening process and the &lt;a href="https://github.com/albinotonnina/react-redux-magichat-demo-booking-system" rel="noopener noreferrer"&gt;take-home assignment&lt;/a&gt; smoothly but I failed to pass one of the final stages, a set of one to one, or two to one, interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whiteboard coding interview&lt;/strong&gt;: algorithms.&lt;/li&gt;
&lt;li&gt;Technical interview: JavaScript, CS, React.&lt;/li&gt;
&lt;li&gt;Culture fit: that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Second whiteboard interview&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It went wrong
&lt;/h3&gt;

&lt;p&gt;There are a few mistakes that contributed to this temporary debacle.&lt;/p&gt;

&lt;p&gt;I may have passed the techical test and the culture fit (let’s just assume that) but I admittedly performed badly at the whiteboard coding interviews.&lt;/p&gt;

&lt;p&gt;Thinking in retrospective about that day I couldn’t expect any different outcome.&lt;/p&gt;

&lt;p&gt;The truth is: &lt;strong&gt;I’m not prepared to do whiteboard interviews&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Whiteboard interviews
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The whiteboard interview is, in some ways, a hybrid of a technical test of the depth of your knowledge and also a social exercise&lt;/em&gt;&lt;br&gt;
(&lt;a href="https://skillcrush.com/2016/03/29/rock-your-next-whiteboard-test/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We all know what it is, right? &lt;em&gt;it’s not much about the code, it’s about your solving abilities, it doesn’t matter if etc etc…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m a frontend developer, I generally don’t implement interview-like algorithms or articulate my thought process while I code, I sort of make interactive UIs most the time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How much do these tests tell about a candidate anyway?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.freecodecamp.org/why-is-hiring-broken-it-starts-at-the-whiteboard-34b088e5a5db" rel="noopener noreferrer"&gt;Someone&lt;/a&gt; even said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In real life, you would rarely just whip up an off-the-cuff algorithm from memory in the middle of a coding session. You are almost always going to use an existing library, which has its own test suite, and has survived the scrutiny of other developers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The only world where you would actually need to be able to recall an algorithm would be a post-apocalyptic one, where the hard drives of all the computers connected to the internet were fried, and all copies of foundational academic papers and computer science textbooks had been reduced to ashes.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My opinion tend to match the one of the aforementioned author although I like to believe that such a skill (being good at whiteboard interviews) is about having a set of very good to have other skills, soft and hard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mitigating circumstances first
&lt;/h3&gt;

&lt;p&gt;I’ll make this list because you may relate to some of them but most of all I still have to vent a little bit 😄&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I didn’t do the interview in my first language. Under pressure and under the spot it suddenly becomes more difficult to talk in english.&lt;/li&gt;
&lt;li&gt;I’m a self taught frontend developer. I lack an academic preparation.&lt;/li&gt;
&lt;li&gt;I didn’t do many interviews in my career. And not many of them had whiteboard interviews kind of tests.&lt;/li&gt;
&lt;li&gt;I don’t do much public speaking. Unfortunately, at the moment, not much.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could object that none of these are actually mitigating circumstances and you would be right.&lt;/p&gt;

&lt;p&gt;By definition, mitigating circumstances are out of our control: the truth is that I could &lt;strong&gt;improve my English&lt;/strong&gt;, &lt;strong&gt;do more CS&lt;/strong&gt;, &lt;strong&gt;do more interviews&lt;/strong&gt;, &lt;strong&gt;do more public speaking&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;I’m gonna try to solve that first whiteboard test the way I should have done that day and I’m going to try to report the process here.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Test
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tokyo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;London&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Donlon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kyoto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Paris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;
  &lt;span class="c1"&gt;// YOUR ALGORITHM&lt;/span&gt;
  &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tokyo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kyoto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;London&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Donlon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Paris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. &lt;em&gt;If you rotate the letters of each city you may or may not match another city. In case you do, put them together in a array on their own.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At work you’re escaping labyrinths of thousands of lines of code on a daily basis, how difficult is to show these people how to solve this simple and even kinda funny problem? Hold my beer.&lt;/p&gt;

&lt;p&gt;Yeah…&lt;/p&gt;

&lt;p&gt;Let’s pretend it went slightly differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  The perfect whiteboard interview
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Catchy paragraph title, although wrong. This is just the way I could have solved this test, both code and thought articulation. Who know how many other ways there are!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; thank you very much. I’ll gladly solve this problem for you (little bow)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; First question, do the letters just ‘rotate’ or they can be randomly mixed up?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Larry&lt;/strong&gt; (to protect the privacy of the interviewers, I changed their name into a fancy one): Just rotate. First letter goes last, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Larry:&lt;/strong&gt; right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Right! I guess to start I would need a way to rotate the letters of each city. Tokyo would became okyoT, then kyoTo, oh cool! we’ve got kyoto now! Ok, I’m going to need a function to do that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; I also need a way to loop through the input cities, ‘rotate’ the letters, do some matching and lastly grouping them together. I see that the input and the output are both arrays and they both contains the same values, the only difference is the depth of the two arrays, a flat one and an array of arrays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Still me:&lt;/strong&gt; I’m gonna write some pseudocode now to validate my thoughts. Later I’m going to test it too, cause I’m that good. 😏&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;groupCitiesByRotatedNames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// use a variable to contain the output.&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="c1"&gt;// loop through each of the cities&lt;/span&gt;
  &lt;span class="c1"&gt;//  rotate the name in any possible combination&lt;/span&gt;
  &lt;span class="c1"&gt;//  check if the output contains a city that matches a combination&lt;/span&gt;
  &lt;span class="c1"&gt;//   add that city to the array containing the match&lt;/span&gt;
  &lt;span class="c1"&gt;//   otherwise add the city to the output as a new array&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Me, confident as a rockstar: let’s pseudotest my pseudocode (😛).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tokyo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;London&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Donlon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kyoto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Paris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;groupCitiesByRotatedNames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;// That's how it would build up. The final output would be the last array:&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ["Tokyo"]&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Tokyo'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['London']&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Tokyo'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['London'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Rome']&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Tokyo'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['London', 'Donlon'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Rome']&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Tokyo','Kyoto'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['London', 'Donlon'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Rome']&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Tokyo','Kyoto'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['London', 'Donlon'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Rome'],&lt;/span&gt;
&lt;span class="c1"&gt;//     ['Paris']&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s start implementing this algorithm.&lt;/p&gt;

&lt;p&gt;First, the utility to rotate the letters of the city names. I will create a utility function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0z06yur12eleh7qna1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0z06yur12eleh7qna1p.png" width="800" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Me: let’s make this function a bit smoother (and less readable). Overconfidence at its peak.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3puee8eoxxix9b3c4ou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3puee8eoxxix9b3c4ou.png" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; Right! I like the reduce method, I’m gonna use it again! (It’s also very functional-programmy so it’s cool to use in an interview 😎)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;reduce()&lt;/code&gt; method applies a function against an accumulator and each element&lt;br&gt;
in the array (from left to right) to reduce it to a single value&lt;br&gt;
(&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce" rel="noopener noreferrer"&gt;MDN&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Our single value being the desired output.&lt;/p&gt;

&lt;h4&gt;
  
  
  Let’s sum up what this algorithm does:
&lt;/h4&gt;

&lt;p&gt;We check for each city in the cities array, we rotate the nameand we match&lt;br&gt;
every combination with the accumulator value. If we find something we add the new city to the array containing the matches (with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice" rel="noopener noreferrer"&gt;Array.splice&lt;/a&gt;) otherwise we just &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push" rel="noopener noreferrer"&gt;push&lt;/a&gt; a new array containing our new city.&lt;/p&gt;

&lt;p&gt;Et voila’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbc67ur5kl6yqelgsicg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbc67ur5kl6yqelgsicg.png" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All together now!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qd2tw55tu2nz70vnroz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qd2tw55tu2nz70vnroz.png" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/albinotonnina/e5eb9589f3a2322678b75461ac230181" rel="noopener noreferrer"&gt;Get the Gist here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The actual whiteboard interview
&lt;/h3&gt;

&lt;p&gt;I started from the solution. I said, ok, I’m gonna need a reduce method. I immediately approached the board to write actual code without really knowing the plan. I did have an idea of the solution, pretty much the one I wrote in the previous chapter, but I didn’t &lt;strong&gt;articulate&lt;/strong&gt; it, I didn’t really &lt;strong&gt;explain&lt;/strong&gt; it consistently to my poor interviewers. So I got lost in the code, I lost the the train of my thoughts several times, I also stumbled on syntax errors, in a mix of poor written pseudocode and actual code. There was no way to turn the tide at this point. A performance like this can make a lot of damage to the outcome of the interviews, especially if you let this affect the rest of the process on your side.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I do now
&lt;/h3&gt;

&lt;p&gt;Practice, practice, practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get a whiteboard, pick a problem and talk out-loud to the air and write, do that a lot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Practice the whiteboard interview, learn the routine. Your routine, any routine. Learn it like a song on the guitar, a card trick or whatever dangerous stunt with your skate.&lt;/p&gt;

&lt;p&gt;You need to prepare a speech, it’s like a presentation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s like a presentation with variables.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A variable is the problem.&lt;/p&gt;

&lt;p&gt;I’ll go like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’ll spend some time analysing the requirements (1 min)&lt;/li&gt;
&lt;li&gt;I’ll formulate questions if necessary and get answers (3 min).&lt;/li&gt;
&lt;li&gt;I’ll pause and think of a direction to take (few min, don’t be afraid to stay silent for a while).&lt;/li&gt;
&lt;li&gt;I will propose initial solutions and get feedback from the interviewers (5 min).&lt;/li&gt;
&lt;li&gt;I will pause again and choose a solution (2 min).&lt;/li&gt;
&lt;li&gt;I will write pseudocode (5 min)&lt;/li&gt;
&lt;li&gt;I will test my pseudocode (5 min)&lt;/li&gt;
&lt;li&gt;I’ll finish by transforming the pseudocode into actual code. (until necessary)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In around 30 min I will have solved the problem in a enjoyable and ordinated way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlge2jbymdp8eqrrxo07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlge2jbymdp8eqrrxo07.png" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks for reading
&lt;/h3&gt;

&lt;p&gt;And Thanks &lt;a href="https://twitter.com/agm1984" rel="noopener noreferrer"&gt;Adam Mackintosh&lt;/a&gt; and &lt;a href="https://twitter.com/JoshWComeau" rel="noopener noreferrer"&gt;Josh Comeau&lt;/a&gt; for proof-reading this :)&lt;/p&gt;

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

&lt;p&gt;Hello, my name is Albino Tonnina, I’m a frontend engineer who does bad whiteboard interviews at the moment and works in London, you can find me on &lt;a href="https://twitter.com/albinotonnina" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://github.com/albinotonnina" rel="noopener noreferrer"&gt;Github&lt;/a&gt; or &lt;a href="https://www.instagram.com/albino_tonnina/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; or around the city.&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>You're going out of scope, again.</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Thu, 03 May 2018 10:47:40 +0000</pubDate>
      <link>https://dev.to/albinotonnina/youre-going-out-of-scope-again-j1g</link>
      <guid>https://dev.to/albinotonnina/youre-going-out-of-scope-again-j1g</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2zg9a2zfnu4xxj7oufm5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2zg9a2zfnu4xxj7oufm5.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello,&lt;br&gt;
I'm a front end developer, I work in a Saas company. &lt;br&gt;
Various apps/projects, agile approach, Jira tickets, git, teams. That is the gist of it.&lt;/p&gt;

&lt;p&gt;I have one problem. A technical one, maybe behavioural, maybe moral:&lt;br&gt;
when I get assigned a new story I struggle to stay in scope.&lt;/p&gt;

&lt;p&gt;I'll go with an example:&lt;/p&gt;

&lt;p&gt;An app with not more than 3 dozens React components, a fairly complex Redux store and a few API calls. It's not a massive app.&lt;/p&gt;

&lt;p&gt;My story is to add, conditionally, a new level of nesting in a list: now some items have subitems, need to change the UI, probably mess a bit with the state/store.&lt;/p&gt;

&lt;p&gt;The code app in my opinion is hard to read, eg. every react component is HOC'ed with a redux wrapper. Or state has too much derived data in it.&lt;br&gt;
Or the file structure is wrong, components have long names, they are organised by type, not by feature and there's a lot of them now. &lt;br&gt;
Or there is no strategy in regards of code formatting, I want no semi, my colleague does. Etc.&lt;/p&gt;

&lt;p&gt;I'm not blaming someone else, I was part of the team that made the app like that, months and months and months ago, at the beginning of our React journey.&lt;/p&gt;

&lt;p&gt;During this time I obviously improved so that code, that I feel responsible for, I just cannot accept it. Actually it became so complex that I'm struggling to reason with it!&lt;/p&gt;

&lt;p&gt;Assume I'm the only one working on the front end of this app at this moment.&lt;/p&gt;

&lt;p&gt;I'm about to go over time because I started to send PR with refactors: prettier on pre-commit to keep it consistent on git, organize the files in the area around my story by feature, remove nested redux HOCs and just pass props 1, max 2 level down and other small refactors. I'm also coding the actual story I was originally assigned but this is obviously taking more time.&lt;/p&gt;

&lt;p&gt;I could have proposed the changes, worked at my story and maybe later, in the future, implement those changes following the process.&lt;/p&gt;

&lt;p&gt;Making this 'big' changes, not strictly related to the assigned story is not right. &lt;br&gt;
It may ruin other people plans. It's just not really good. But I kinda forced my stakeholders into taking those changes.&lt;/p&gt;

&lt;p&gt;Although now the code is already in a much better state and I can finally work with it effectively.&lt;/p&gt;

&lt;p&gt;What should I've done? &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Introducing mmarkdown</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Mon, 23 Apr 2018 01:02:15 +0000</pubDate>
      <link>https://dev.to/albinotonnina/introducing-mmarkdown-1dn6</link>
      <guid>https://dev.to/albinotonnina/introducing-mmarkdown-1dn6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcj9imhfqpbj965ceysk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcj9imhfqpbj965ceysk0.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Markdown on caffeine.
&lt;/h1&gt;

&lt;p&gt;Have you ever wanted a bit more from your markdown files?&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/albinotonnina/mmarkdown" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mmarkdown takes a plain markdown file and generates a copy of it.&lt;/p&gt;

&lt;p&gt;It starts to be less boring when you add &lt;a href="https://help.github.com/articles/creating-and-highlighting-code-blocks/" rel="noopener noreferrer"&gt;fenced code blocks&lt;/a&gt; with the language identifier set to &lt;code&gt;mmd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F52pfcbjdc35e8zdhftsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F52pfcbjdc35e8zdhftsb.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;will output:&lt;/p&gt;

&lt;h4&gt;
  
  
  Hello Jessie
&lt;/h4&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Everything that is returned (as a string) from the code in a block will be interpreted and replaced to the block in the output file.&lt;/p&gt;

&lt;p&gt;It's full async, which is cool, &lt;em&gt;lots of &lt;code&gt;awaits&lt;/code&gt; are waiting for you&lt;/em&gt; there but soon enough you will face a problem: too much code to write in a markdown file! Terrible experience!&lt;/p&gt;

&lt;p&gt;The solution in mmarkdown is in the &lt;code&gt;scripts&lt;/code&gt; option. &lt;br&gt;
You can pass the path of a javascript module in your app to the mmarkdown command.&lt;br&gt;
The module that the scripts file returns will be passed to the context of the fenced block, eg:&lt;/p&gt;

&lt;p&gt;This block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//scripts is passed&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;processMyArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myFinalString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#### &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;myFinalString&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and this script file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;processMyArray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; async&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;}))&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will output:&lt;/p&gt;

&lt;h4&gt;
  
  
  1 async
&lt;/h4&gt;

&lt;h4&gt;
  
  
  3 async
&lt;/h4&gt;

&lt;h4&gt;
  
  
  5 async
&lt;/h4&gt;

&lt;p&gt;(The setTimeout is there just for demo purposes)&lt;/p&gt;

&lt;h3&gt;
  
  
  Backup
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;backup&lt;/code&gt; option, false by default, will make a copy of the current output file, postfix it with a timestamp and move it into &lt;code&gt;backupPath&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can you imagine an use for this?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/6heBQSjt2IoA8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/6heBQSjt2IoA8/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Share it in the comments!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;Don't forget to add me on &lt;a href="https://twitter.com/albinotonnina" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; ok? :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TDD, all the time?</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Thu, 29 Mar 2018 16:38:27 +0000</pubDate>
      <link>https://dev.to/albinotonnina/tdd-all-the-time-2ci4</link>
      <guid>https://dev.to/albinotonnina/tdd-all-the-time-2ci4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fv4axbrlqmcej7glafwet.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fv4axbrlqmcej7glafwet.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You actually do TDD all the time? Sometimes? When fixing bugs? When doing APIs, when doing UIs, when? &lt;br&gt;
Or you do DDT, development driven testing? &lt;br&gt;
Ok, I just made up the last one.&lt;/p&gt;

&lt;p&gt;I find it an amazing approach, I rarely do it. When I know exactly what I'm gonna code yes it just works.&lt;br&gt;
Most of the time though I reiterate so much on my code that it just does not feel right. I prefer to finish my code and then add tests to them.&lt;br&gt;
This obviously need some forward thinking. &lt;/p&gt;

&lt;p&gt;So I'd say: I think in TDD, I don't do TDD.&lt;/p&gt;

&lt;p&gt;What about you people?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>javascript</category>
    </item>
    <item>
      <title>GraphQL, pronunciation</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Wed, 28 Mar 2018 11:31:34 +0000</pubDate>
      <link>https://dev.to/albinotonnina/graphql-pronunciation-19ka</link>
      <guid>https://dev.to/albinotonnina/graphql-pronunciation-19ka</guid>
      <description>&lt;p&gt;I'm starting to like graphQL so I wanna get this right :)&lt;br&gt;
Is it 'graph-cue-el' or 'graph-cool'?&lt;br&gt;
I hear both, what are your thoughts?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>graphql</category>
    </item>
    <item>
      <title>Speaking of web layouts. Introducing the Magic Hat technique 🎩✨</title>
      <dc:creator>Albino Tonnina</dc:creator>
      <pubDate>Mon, 26 Mar 2018 14:23:04 +0000</pubDate>
      <link>https://dev.to/albinotonnina/speaking-of-web-layouts-introducing-the-magic-hat-technique--5220</link>
      <guid>https://dev.to/albinotonnina/speaking-of-web-layouts-introducing-the-magic-hat-technique--5220</guid>
      <description>&lt;p&gt;Can you think of one of the apps you're working on and imagine the following technique applied to parts of it? Then, would you use it?&lt;br&gt;
&lt;strong&gt;The reading should take around 5 minutes.&lt;/strong&gt; &lt;br&gt;
Thanks, Albino.&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://medium.com/@albinotonnina/magic-hat-technique-408a3fa590bb" rel="noopener noreferrer"&gt;Original post on medium.com&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Once upon a time (few weeks ago) I’ve been asked to work on a new product. &lt;em&gt;“Start solo withUI &amp;amp; FE, it’s greenfield, feel free to experiment.”&lt;/em&gt;&lt;br&gt;
I guess that my response, something like “all right”, was a bit underplayed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftwasn9517wnjxltc71a8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftwasn9517wnjxltc71a8.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sadly, a couple of long long weeks later I didn’t have a clue about how to build an interface for this application.&lt;/p&gt;

&lt;p&gt;I said ok, &lt;em&gt;think&lt;/em&gt;, we’re gonna need a header, we’re gonna need a footer and we’re gonna need a sidebar, that’s all I know. We will then start making pages and we will put the importantstuff in the remaining white space, you know, the app, the , the core, the juice, the &lt;em&gt;whatever&lt;/em&gt; the user should be playing with.&lt;/p&gt;

&lt;p&gt;Something like the next picture here, right?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F5760%2F1%2A6DpJPOVyaAkfDsFPhAZdig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F5760%2F1%2A6DpJPOVyaAkfDsFPhAZdig.png" alt="This is my canonical idea of a web app"&gt;&lt;/a&gt;&lt;em&gt;This is my canonical idea of a web app&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I said to myself: &lt;strong&gt;No! Wrong! I already put myself in a cage&lt;/strong&gt; and I’m barely prototyping! These flows are too complicated to be packed into these &lt;em&gt;A4/Letter&lt;/em&gt; frozen frames, I said. I’m gonna spend ages figuring out the user flows here. Let’s change perspective. &lt;strong&gt;Let’s go all the way holistic on this!&lt;/strong&gt; I said it out loud this time (I’ve got a bit dramatic at that point)&lt;/p&gt;

&lt;p&gt;I wanted to make something complex look very simple. I wanted to &lt;strong&gt;give the user a strong feeling of control&lt;/strong&gt;. I wanted a &lt;em&gt;smart&lt;/em&gt; app and I’m not sure I’m doing the right thing here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3okj7pt8dy1hlj6rtzkc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3okj7pt8dy1hlj6rtzkc.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Procrastination to the rescue!
&lt;/h2&gt;

&lt;p&gt;I was obviously looking into my phone to enjoy a &lt;strong&gt;totally deserved&lt;/strong&gt; break after these intense brainstorming sessions between me and myself.&lt;br&gt;
You know it, mobile UIs look so clear compared to the ones I build for web apps. The UX there is just right, the cognitive load is low, the motions are just &lt;strong&gt;yummy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That and &lt;strong&gt;React&lt;/strong&gt;, that’s where this idea of the &lt;strong&gt;Magic Hat technique&lt;/strong&gt; comes from. And lots of energy drinks.&lt;br&gt;
The &lt;strong&gt;declarative&lt;/strong&gt;, &lt;strong&gt;functional&lt;/strong&gt;, &lt;strong&gt;reactive&lt;/strong&gt; sides of React, mostly, and the &lt;strong&gt;modularity&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖼 The MUV
&lt;/h2&gt;

&lt;p&gt;I’ve got this image of a &lt;strong&gt;Minimum Usable View&lt;/strong&gt;, a piece of UI that would do just one thing, in isolation, almost pure, like we do in code. Something the user could center with, concentrate on, work with. Something like React components! Smart bricks in a bucket that do one thing that you, &lt;em&gt;or the user I say&lt;/em&gt;, can put together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhxm286hyi5fcsg8330bg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhxm286hyi5fcsg8330bg.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Wait!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Two MUVs could be better than one&lt;/strong&gt; actually, if they somehow complement each other. Not three, definitely not four, that would be a lot to process for my brain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ff82r2edhgugrmpso2rzk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ff82r2edhgugrmpso2rzk.gif" alt="Two MUV (Minimum Usable Views), totally made up acronym by the way."&gt;&lt;/a&gt;&lt;em&gt;Two MUV (Minimum Usable Views), totally made up acronym by the way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Looks like a &lt;a href="http://designinginterfaces.com/patterns/one-window-drilldown/" rel="noopener noreferrer"&gt;one window drill-down&lt;/a&gt; UI pattern but with two, ahem, MUVs. 😎&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When everything’s on one screen or window, the options at each stage are clear, and the user knows they don’t need to focus their attention anywhere else.&lt;br&gt;
&lt;a href="http://www.pattron.net/Pattern.aspx?Id=81" rel="noopener noreferrer"&gt;Pattron&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quite &lt;strong&gt;good for user’s cognitive load:&lt;/strong&gt; there is not much going on inside the screen, justwhat you want the user to focus on.&lt;/p&gt;

&lt;p&gt;Each &lt;strong&gt;MUV&lt;/strong&gt; can and should be designed in almost complete isolation, like a &lt;strong&gt;black box&lt;/strong&gt;: things get in, the data, and things get out, something like &lt;em&gt;declarative intentions&lt;/em&gt;: the user expects to do &lt;em&gt;that&lt;/em&gt; on the next frame.&lt;/p&gt;

&lt;p&gt;Yes, because, like a &lt;a href="https://github.com/albinotonnina/javascript-data-structures-and-algorithms/tree/master/src/dataStructures/SinglyLinkedList" rel="noopener noreferrer"&gt;Singly Linked list&lt;/a&gt;, &lt;strong&gt;each MUV sets what goes next&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Singly Linked List is a linear collection of data elements, called nodes pointing to thenext node by means of pointer. It is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of data and a reference (in other words, a link) to the next node in the sequence.&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Linked_list#Singly_linked_list" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp099s2te6tbombw8auzi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp099s2te6tbombw8auzi.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  The thing is that at any given point the screen is showing you only two related pieces of UI.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;The right view is something the user wanted to happen in the left view, &lt;em&gt;which is the right view of a previous left view, which is the right view of a previous left v…&lt;/em&gt;&lt;br&gt;
&lt;em&gt;[…]&lt;br&gt;
[…]&lt;br&gt;
..ich is the right view of the first view.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The motions
&lt;/h2&gt;

&lt;p&gt;Naturally, a technique like this really depends on motion.&lt;br&gt;
&lt;a href="https://medium.com/ux-in-motion/creating-usability-with-motion-the-ux-in-motion-manifesto-a87a4584ddc" rel="noopener noreferrer"&gt;The UX in Motion Manifesto&lt;/a&gt; is a must read article.&lt;br&gt;
Of the 12 principles it describes, I think the one that apply the most are:&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Parenting&lt;/strong&gt;: Creates spatial and temporal hierarchical relationships when interacting with multiple objects.&lt;/p&gt;

&lt;p&gt;6) &lt;strong&gt;Masking&lt;/strong&gt;: Creates continuity in an interface object or object group when utility is determined by which part of the object or group is revealed or concealed.&lt;/p&gt;

&lt;h2&gt;
  
  
  By the way why this name, the Magic Hat technique?
&lt;/h2&gt;

&lt;p&gt;So I can use these two emojis together 🎩✨ and well, it’s like that: &lt;strong&gt;in a view the user canpick the next thing to put on screen.&lt;/strong&gt; It’s pretty much it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏖 The code sandbox
&lt;/h2&gt;

&lt;p&gt;First, a basic basic demo in React to show &lt;em&gt;the mechanics&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/r4v7onrpop" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcodesandbox.io%2Fstatic%2Fimg%2Fplay-codesandbox.svg" alt="Edit React Magic Hat example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎡 The actual demo
&lt;/h2&gt;

&lt;p&gt;The following one is a little app I put together. I hope it gives you the idea.&lt;br&gt;
From a technical point of view each &lt;strong&gt;MUV&lt;/strong&gt; is naturally independent so building an app likethis is quite trivial, since you build each UI in isolation. The &lt;em&gt;piping&lt;/em&gt; in the UI is done by the implementation of this technique (I did one in React)&lt;br&gt;
The views get the space they want by the way and they can be styled anyway you like. I like to have mine &lt;em&gt;flex. I love flex. And React Portal.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  🎩 &lt;a href="https://albinotonnina.github.io/demo-magic-hat/" rel="noopener noreferrer"&gt;https://albinotonnina.github.io/demo-magic-hat/&lt;/a&gt;
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Advantages?
&lt;/h2&gt;

&lt;p&gt;Imagine &lt;strong&gt;how scalable this could be.&lt;/strong&gt; Adding a feature (one or more MUVs) would not break any layout. You just &lt;em&gt;pipe in&lt;/em&gt; new MUVs and add &lt;em&gt;links&lt;/em&gt; so to open them from any other MUV.&lt;/p&gt;

&lt;p&gt;For the user this should be kinda natural if you think about it. It’s not different from thebrowser experience with the back and forward buttons. It actually works the same way. &lt;strong&gt;It’s the user that &lt;em&gt;create&lt;/em&gt; his own &lt;em&gt;path&lt;/em&gt;.&lt;/strong&gt;&lt;br&gt;
This path would be the list of MUVs that the user choose to open, a list ready to be persisted or tracked, also.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 The React library
&lt;/h2&gt;

&lt;p&gt;This is something I would never dream to do without a UI framework such as React, or Vue, orthe next one probably.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Introducing &lt;a href="https://github.com/albinotonnina/react-magic-hat" rel="noopener noreferrer"&gt;react-magic-hat&lt;/a&gt; 🎩✨
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;⚡🚀 Blazing fast. 60+ FPS hardware-accelerated CSS transforms, using the &lt;a href="https://aerotwist.com/blog/flip-your-animations/#the-general-approach" rel="noopener noreferrer"&gt;FLIP technique&lt;/a&gt;. Fluid and performant.&lt;/p&gt;

&lt;p&gt;🎈Extra light, only 6.5kb and no dependencies.&lt;/p&gt;

&lt;p&gt;🧘‍‍Flexible, stateful or stateless (you get both components) and UI-less, you do the layoutingand styling.&lt;/p&gt;

&lt;p&gt;🎛 Highly configurable, hope you like the API!&lt;/p&gt;

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

&lt;p&gt;This is a technique with the purpose of reducing the &lt;em&gt;the total amount of mental effort thatis required to complete a task involving processing of information,&lt;/em&gt; in short &lt;strong&gt;cognitive load&lt;/strong&gt;, by limiting the amount of UI on the screen in favour of a &lt;em&gt;runtime-like&lt;/em&gt; linked list ofsequential independent UIs called &lt;strong&gt;MUVs&lt;/strong&gt; (Minimum Usable Views)&lt;/p&gt;

&lt;p&gt;I don’t know how much of an app you can do using this technique, or if the previous sentencemakes any sense to you, but so far I’ve been satisfied every time I did experiments with it.&lt;/p&gt;

&lt;p&gt;We sure should never stop experimenting and pulling things out of out magic geeky hats 🎩✨&lt;/p&gt;

&lt;p&gt;My name is Albino Tonnina, I’m a developer in &lt;a href="http://www.workshare.com" rel="noopener noreferrer"&gt;Workshare&lt;/a&gt;, London.&lt;br&gt;
I owe a lot to this company, I learned there that I have a lot to learn, always.&lt;/p&gt;

&lt;p&gt;You can find me on &lt;a href="https://twitter.com/albinotonnina" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or on &lt;a href="http://github.com/albinotonnina/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or you can check &lt;a href="http://www.albinotonnina.com" rel="noopener noreferrer"&gt;my website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
