<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Process on Smashing Magazine — For Web Designers And Developers</title><link>https://www.smashingmagazine.com/category/process/index.xml</link><description>Recent content in Process on Smashing Magazine — For Web Designers And Developers</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 14 Oct 2025 04:02:41 +0000</lastBuildDate><item><author>Yegor Gilyov</author><title>Intent Prototyping: A Practical Guide To Building With Clarity (Part 2)</title><link>https://www.smashingmagazine.com/2025/10/intent-prototyping-practical-guide-building-clarity/</link><pubDate>Fri, 03 Oct 2025 10:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2025/10/intent-prototyping-practical-guide-building-clarity/</guid><description>Ready to move beyond static mockups? Here is a practical, step-by-step guide to Intent Prototyping &amp;mdash; a disciplined method that uses AI to turn your design intent (UI sketches, conceptual models, and user flows) directly into a live prototype, making it your primary canvas for ideation.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2025/10/intent-prototyping-practical-guide-building-clarity/" />
              <title>Intent Prototyping: A Practical Guide To Building With Clarity (Part 2)</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Intent Prototyping: A Practical Guide To Building With Clarity (Part 2)</h1>
                  
                    
                    <address>Yegor Gilyov</address>
                  
                  <time datetime="2025-10-03T10:00:00&#43;00:00" class="op-published">2025-10-03T10:00:00+00:00</time>
                  <time datetime="2025-10-03T10:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>In <strong><a href="https://www.smashingmagazine.com/2025/09/intent-prototyping-pure-vibe-coding-enterprise-ux/">Part 1</a></strong> of this series, we explored the “lopsided horse” problem born from mockup-centric design and demonstrated how the seductive promise of vibe coding often leads to structural flaws. The main question remains:</p>

<blockquote>How might we close the gap between our design intent and a live prototype, so that we can iterate on real functionality from day one, without getting caught in the ambiguity trap?</blockquote>

<p>In other words, we need a way to build prototypes that are both fast to create and founded on a clear, unambiguous blueprint.</p>

<p>The answer is a more disciplined process I call <strong>Intent Prototyping</strong> (kudos to Marco Kotrotsos, who coined <a href="https://kotrotsos.medium.com/intent-oriented-programming-bridging-human-thought-and-ai-machine-execution-3a92373cc1b6">Intent-Oriented Programming</a>). This method embraces the power of AI-assisted coding but rejects ambiguity, putting the designer’s explicit <em>intent</em> at the very center of the process. It receives a holistic expression of <em>intent</em> (sketches for screen layouts, conceptual model description, boxes-and-arrows for user flows) and uses it to generate a live, testable prototype.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="491"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg"
			
			sizes="100vw"
			alt="Diagram showing sketches, a conceptual model, and user flows as inputs to Intent Prototyping, which outputs a live prototype."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The Intent Prototyping workflow. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/1-intent-prototyping.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This method solves the concerns we’ve discussed in Part 1 in the best way possible:</p>

<ul>
<li><strong>Unlike static mockups,</strong> the prototype is fully interactive and can be easily populated with a large amount of realistic data. This lets us test the system’s underlying logic as well as its surface.</li>
<li><strong>Unlike a vibe-coded prototype</strong>, it is built from a stable, unambiguous specification. This prevents the conceptual model failures and design debt that happen when things are unclear. The engineering team doesn’t need to reverse-engineer a black box or become “code archaeologists” to guess at the designer’s vision, as they receive not only a live prototype but also a clearly documented design intent behind it.</li>
</ul>

<p>This combination makes the method especially suited for designing complex enterprise applications. It allows us to test the system’s most critical point of failure, its underlying structure, at a speed and flexibility that was previously impossible. Furthermore, the process is built for iteration. You can explore as many directions as you want simply by changing the intent and evolving the design based on what you learn from user testing.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="my-workflow">My Workflow</h2>

<p>To illustrate this process in action, let’s walk through a case study. It’s the very same example I’ve used to illustrate the vibe coding trap: a simple tool to track tests to validate product ideas. You can find the complete project, including all the source code and documentation files discussed below, in this <a href="https://github.com/YegorGilyov/reality-check">GitHub repository</a>.</p>

<h3 id="step-1-expressing-an-intent">Step 1: Expressing An Intent</h3>

<p>Imagine we’ve already done proper research, and having mused on the defined problem, I begin to form a vague idea of what the solution might look like. I need to capture this idea immediately, so I quickly sketch it out:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="583"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png"
			
			sizes="100vw"
			alt="A rough sketch of screens to manage product ideas and reality checks."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A low-fidelity sketch of the initial idea. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/2-low-fidelity-sketch-initial-idea.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>In this example, I used Excalidraw, but the tool doesn’t really matter. Note that we deliberately keep it rough, as visual details are not something we need to focus on at this stage. And we are not going to be stuck here: we want to make a leap from this initial sketch directly to a live prototype that we can put in front of potential users. Polishing those sketches would not bring us any closer to achieving our goal.</p>

<p>What we need to move forward is to add to those sketches just enough details so that they may serve as a sufficient input for a junior frontend developer (or, in our case, an AI assistant). This requires explaining the following:</p>

<ul>
<li>Navigational paths (clicking here takes you to).</li>
<li>Interaction details that can’t be shown in a static picture (e.g., non-scrollable areas, adaptive layout, drag-and-drop behavior).</li>
<li>What parts might make sense to build as reusable components.</li>
<li>Which components from the design system (I’m using <a href="https://ant.design/">Ant Design Library</a>) should be used.</li>
<li>Any other comments that help understand how this thing should work (while sketches illustrate how it should look).</li>
</ul>

<p>Having added all those details, we end up with such an annotated sketch:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="399"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png"
			
			sizes="100vw"
			alt="The initial sketch with annotations specifying components, navigation, and interaction details."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The sketch annotated with details. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/3-sketch-annotated-details.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>As you see, this sketch covers both the Visualization and Flow aspects. You may ask, what about the Conceptual Model? Without that part, the expression of our <em>intent</em> will not be complete. One way would be to add it somewhere in the margins of the sketch (for example, as a UML Class Diagram), and I would do so in the case of a more complex application, where the model cannot be simply derived from the UI. But in our case, we can save effort and ask an LLM to generate a comprehensive description of the conceptual model based on the sketch.</p>

<p>For tasks of this sort, the LLM of my choice is Gemini 2.5 Pro. What is important is that this is a multimodal model that can accept not only text but also images as input (GPT-5 and Claude-4 also fit that criteria). I use Google AI Studio, as it gives me enough control and visibility into what’s happening:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="579"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png"
			
			sizes="100vw"
			alt="Screenshot of Google AI Studio with an annotated sketch as input."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Generating a conceptual model from the sketch using Google AI Studio. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/4-google-ai-studio.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p><strong>Note</strong>: <em>All the prompts that I use here and below can be found in the <a href="#appendices">Appendices</a>. The prompts are not custom-tailored to any particular project; they are supposed to be reused as they are.</em></p>

<p>As a result, Gemini gives us a description and the following diagram:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="480"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg"
			
			sizes="100vw"
			alt="UML class diagram showing two connected entities: “ProductIdea” and “RealityCheck”."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      UML class diagram. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/5-uml-class.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The diagram might look technical, but I believe that a clear understanding of all objects, their attributes, and relationships between them is key to good design. That’s why I consider the Conceptual Model to be an essential part of expressing <em>intent</em>, along with the Flow and Visualization.</p>

<p>As a result of this step, our <em>intent</em> is fully expressed in two files: <code>Sketch.png</code> and <code>Model.md</code>. This will be our durable source of truth.</p>

<h3 id="step-2-preparing-a-spec-and-a-plan">Step 2: Preparing A Spec And A Plan</h3>

<p>The purpose of this step is to create a comprehensive technical specification and a step-by-step plan. Most of the work here is done by AI; you just need to keep an eye on it.</p>

<p>I separate the Data Access Layer and the UI layer, and create specifications for them using two different prompts (see <a href="#appendices">Appendices 2 and 3</a>). The output of the first prompt (the Data Access Layer spec) serves as an input for the second one. Note that, as an additional input, we give the guidelines tailored for prototyping needs (see <a href="#appendices">Appendices 8, 9, and 10</a>). They are not specific to this project. The technical approach encoded in those guidelines is out of the scope of this article.</p>

<p>As a result, Gemini provides us with content for <code>DAL.md</code> and <code>UI.md</code>. Although in most cases this result is quite reliable enough, you might want to scrutinize the output. You don’t need to be a real programmer to make sense of it, but some level of programming literacy would be really helpful. However, even if you don’t have such skills, don’t get discouraged. The good news is that if you don’t understand something, you always know who to ask. Do it in Google AI Studio before refreshing the context window. If you believe you’ve spotted a problem, let Gemini know, and it will either fix it or explain why the suggested approach is actually better.</p>

<p>It’s important to remember that by their nature, <strong>LLMs are not deterministic</strong> and, to put it simply, can be forgetful about small details, especially when it comes to details in sketches. Fortunately, you don’t have to be an expert to notice that the “Delete” button, which is in the upper right corner of the sketch, is not mentioned in the spec.</p>

<p>Don’t get me wrong: Gemini does a stellar job most of the time, but there are still times when it slips up. Just let it know about the problems you’ve spotted, and everything will be fixed.</p>

<p>Once we have <code>Sketch.png</code>, <code>Model.md</code>, <code>DAL.md</code>, <code>UI.md</code>, and we have reviewed the specs, we can grab a coffee. We deserve it: our technical design documentation is complete. It will serve as a stable foundation for building the actual thing, without deviating from our original intent, and ensuring that all components fit together perfectly, and all layers are stacked correctly.</p>

<p>One last thing we can do before moving on to the next steps is to prepare a step-by-step plan. We split that plan into two parts: one for the Data Access Layer and another for the UI. You can find prompts I use to create such a plan in <a href="#appendices">Appendices 4 and 5</a>.</p>

<h3 id="step-3-executing-the-plan">Step 3: Executing The Plan</h3>

<p>To start building the actual thing, we need to switch to another category of AI tools. Up until this point, we have relied on Generative AI. It excels at creating new content (in our case, specifications and plans) based on a single prompt. I’m using Google Gemini 2.5 Pro in Google AI Studio, but other similar tools may also fit such one-off tasks: ChatGPT, Claude, Grok, and DeepSeek.</p>

<p>However, at this step, this wouldn’t be enough. Building a prototype based on specs and according to a plan requires an AI that can read context from multiple files, execute a sequence of tasks, and maintain coherence. A simple generative AI can’t do this. It would be like asking a person to build a house by only ever showing them a single brick. What we need is an agentic AI that can be given the full house blueprint and a project plan, and then get to work building the foundation, framing the walls, and adding the roof in the correct sequence.</p>

<p>My coding agent of choice is Google Gemini CLI, simply because Gemini 2.5 Pro serves me well, and I don’t think we need any middleman like Cursor or Windsurf (which would use Claude, Gemini, or GPT under the hood anyway). If I used Claude, my choice would be Claude Code, but since I’m sticking with Gemini, Gemini CLI it is. But if you prefer Cursor or Windsurf, I believe you can apply the same process with your favourite tool.</p>

<p>Before tasking the agent, we need to create a basic template for our React application. I won’t go into this here. You can find plenty of tutorials on how to scaffold an empty React project using Vite.</p>

<p>Then we put all our files into that project:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="666"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png"
			
			sizes="100vw"
			alt="A file directory showing the docs folder containing DAL.md, Model.md, Sketch.png, and UI.md."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Project structure with design intent and spec files. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/6-project-structure-design-intent-spec-files.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Once the basic template with all our files is ready, we open Terminal, go to the folder where our project resides, and type “gemini”:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="419"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png"
			
			sizes="100vw"
			alt="Screenshot of a terminal showing the Gemini CLI."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Gemini CLI. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/7-gemini.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>And we send the prompt to build the Data Access Layer (see <a href="#appendices">Appendix 6</a>). That prompt implies step-by-step execution, so upon completion of each step, I send the following:</p>

<div class="break-out">
<pre><code class="language-markdown">Thank you! Now, please move to the next task.
Remember that you must not make assumptions based on common patterns; always verify them with the actual data from the spec. 
After each task, stop so that I can test it. Don’t move to the next task before I tell you to do so.
</code></pre>
</div>

<p>As the last task in the plan, the agent builds a special page where we can test all the capabilities of our Data Access Layer, so that we can manually test it. It may look like this:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="572"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png"
			
			sizes="100vw"
			alt="A basic webpage with forms and buttons to test the Data Access Layer’s CRUD functions."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The AI-generated test page for the Data Access Layer. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/8-ai-generated-test-page-data-access-layer.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>It doesn’t look fancy, to say the least, but it allows us to ensure that the Data Access Layer works correctly before we proceed with building the final UI.</p>

<p>And finally, we clear the Gemini CLI context window to give it more headspace and send the prompt to build the UI (see <a href="#appendices">Appendix 7</a>). This prompt also implies step-by-step execution. Upon completion of each step, we test how it works and how it looks, following the “Manual Testing Plan” from <code>UI-plan.md</code>. I have to say that despite the fact that the sketch has been uploaded to the model context and, in general, Gemini tries to follow it, attention to visual detail is not one of its strengths (yet). Usually, a few additional nudges are needed at each step to improve the look and feel:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="320"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png"
			
			sizes="100vw"
			alt="A before-and-after comparison showing the UI&#39;s visual improvement."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Refining the AI-generated UI to match the sketch. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/9-refined-ai-generated-ui.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Once I’m happy with the result of a step, I ask Gemini to move on:</p>

<div class="break-out">
<pre><code class="language-markdown">Thank you! Now, please move to the next task.
Make sure you build the UI according to the sketch; this is very important. Remember that you must not make assumptions based on common patterns; always verify them with the actual data from the spec and the sketch.  
After each task, stop so that I can test it. Don’t move to the next task before I tell you to do so.
</code></pre>
</div>

<p>Before long, the result looks like this, and in every detail it works exactly as we <em>intended</em>:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="486"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png"
			
			sizes="100vw"
			alt="Screenshots of the final, polished application UI."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The final interactive prototype. (<a href='https://files.smashing.media/articles/intent-prototyping-practical-guide-building-clarity/10-final-interactive-prototype.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The prototype is up and running and looking nice. Does it mean that we are done with our work? Surely not, the most fascinating part is just beginning.</p>

<div class="partners__lead-place"></div>

<h3 id="step-4-learning-and-iterating">Step 4: Learning And Iterating</h3>

<p>It’s time to put the prototype in front of potential users and learn more about whether this solution relieves their pain or not.</p>

<p>And as soon as we learn something new, we iterate. We adjust or extend the sketches and the conceptual model, based on that new input, we update the specifications, create plans to make changes according to the new specifications, and execute those plans. In other words, for every iteration, we repeat the steps I’ve just walked you through.</p>

<h3 id="is-this-workflow-too-heavy">Is This Workflow Too Heavy?</h3>

<p>This four-step workflow may create an impression of a somewhat heavy process that requires too much thinking upfront and doesn’t really facilitate creativity. But before jumping to that conclusion, consider the following:</p>

<ul>
<li>In practice, only the first step requires real effort, as well as learning in the last step. AI does most of the work in between; you just need to keep an eye on it.</li>
<li>Individual iterations don’t need to be big. You can start with a <a href="https://wiki.c2.com/?WalkingSkeleton">Walking Skeleton</a>: the bare minimum implementation of the thing you have in mind, and add more substance in subsequent iterations. You are welcome to change your mind about the overall direction in between iterations.</li>
<li>And last but not least, maybe the idea of “think before you do” is not something you need to run away from. A clear and unambiguous statement of intent can prevent many unnecessary mistakes and save a lot of effort down the road.</li>
</ul>

<h2 id="intent-prototyping-vs-other-methods">Intent Prototyping Vs. Other Methods</h2>

<p>There is no method that fits all situations, and Intent Prototyping is not an exception. Like any specialized tool, it has a specific purpose. The most effective teams are not those who master a single method, but those who understand which approach to use to mitigate the most significant risk at each stage. The table below gives you a way to make this choice clearer. It puts Intent Prototyping next to other common methods and tools and explains each one in terms of the primary goal it helps achieve and the specific risks it is best suited to mitigate.</p>

<table class="tablesaw break-out" style="grid-column: 3 / 18; font-size: 13pt;">
    <thead>
        <tr>
            <th>Method/Tool</th>
            <th>Goal</th>
            <th>Risks it is best suited to mitigate</th>
            <th width="300">Examples</th>
            <th>Why</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Intent Prototyping</td>
            <td>To rapidly iterate on the fundamental architecture of a data-heavy application with a complex conceptual model, sophisticated business logic, and non-linear user flows.</td>
            <td>Building a system with a flawed or incoherent conceptual model, leading to critical bugs and costly refactoring.</td>
            <td><ul><li>A CRM (Customer Relationship Management system).</li><li>A Resource Management Tool.</li><li>A No-Code Integration Platform (admin’s UI).</li></ul></td>
            <td>It enforces conceptual clarity. This not only de-risks the core structure but also produces a clear, documented blueprint that serves as a superior specification for the engineering handoff.</td>
        </tr>
        <tr>
            <td>Vibe Coding (Conversational)</td>
            <td>To rapidly explore interactive ideas through improvisation.</td>
            <td>Losing momentum because of analysis paralysis.</td>
            <td><ul><li>An interactive data table with live sorting/filtering.</li><li>A novel navigation concept.</li><li>A proof-of-concept for a single, complex component.</li></ul></td>
            <td>It has the smallest loop between an idea conveyed in natural language and an interactive outcome.</td>
        </tr>
        <tr>
            <td>Axure</td>
            <td>To test complicated conditional logic within a specific user journey, without having to worry about how the whole system works.</td>
            <td>Designing flows that break when users don’t follow the “happy path.”</td>
            <td><ul><li>A multi-step e-commerce checkout.</li><li>A software configuration wizard.</li><li>A dynamic form with dependent fields.</li></ul></td>
            <td>It’s made to create complex <code>if-then</code> logic and manage variables visually. This lets you test complicated paths and edge cases in a user journey without writing any code.</td>
        </tr>
        <tr>
            <td>Figma</td>
            <td>To make sure that the user interface looks good, aligns with the brand, and has a clear information architecture.</td>
            <td>Making a product that looks bad, doesn't fit with the brand, or has a layout that is hard to understand.</td>
            <td><ul><li>A marketing landing page.</li><li>A user onboarding flow.</li><li>Presenting a new visual identity.</li></ul></td>
            <td>It excels at high-fidelity visual design and provides simple, fast tools for linking static screens.</td>
        </tr>
        <tr>
            <td>ProtoPie, Framer</td>
            <td>To make high-fidelity micro-interactions feel just right.</td>
            <td>Shipping an application that feels cumbersome and unpleasant to use because of poorly executed interactions.</td>
            <td><ul><li>A custom pull-to-refresh animation.</li><li>A fluid drag-and-drop interface.</li><li>An animated chart or data visualization.</li></ul></td>
            <td>These tools let you manipulate animation timelines, physics, and device sensor inputs in great detail. Designers can carefully work on and test the small things that make an interface feel really polished and fun to use.</td>
        </tr>
        <tr>
            <td>Low-code / No-code Tools (e.g., Bubble, Retool)</td>
            <td>To create a working, data-driven app as quickly as possible.</td>
            <td>The application will never be built because traditional development is too expensive.</td>
            <td><ul><li>An internal inventory tracker.</li><li>A customer support dashboard.</li><li>A simple directory website.</li></ul></td>
            <td>They put a UI builder, a database, and hosting all in one place. The goal is not merely to make a prototype of an idea, but to make and release an actual, working product. This is the last step for many internal tools or MVPs.</td>
        </tr>
    </tbody>
</table>

<p><br /></p>

<p>The key takeaway is that each method is a <strong>specialized tool for mitigating a specific type of risk</strong>. For example, Figma de-risks the visual presentation. ProtoPie de-risks the feel of an interaction. Intent Prototyping is in a unique position to tackle the most foundational risk in complex applications: building on a flawed or incoherent conceptual model.</p>

<div class="partners__lead-place"></div>

<h2 id="bringing-it-all-together">Bringing It All Together</h2>

<p>The era of the “lopsided horse” design, sleek on the surface but structurally unsound, is a direct result of the trade-off between fidelity and flexibility. This trade-off has led to a process filled with redundant effort and misplaced focus. Intent Prototyping, powered by modern AI, eliminates that conflict. It’s not just a shortcut to building faster &mdash; it’s a <strong>fundamental shift in how we design</strong>. By putting a clear, unambiguous <em>intent</em> at the heart of the process, it lets us get rid of the redundant work and focus on architecting a sound and robust system.</p>

<p>There are three major benefits to this renewed focus. First, by going straight to live, interactive prototypes, we shift our validation efforts from the surface to the deep, testing the system’s actual logic with users from day one. Second, the very act of documenting the design <em>intent</em> makes us clear about our ideas, ensuring that we fully understand the system’s underlying logic. Finally, this documented <em>intent</em> becomes a durable source of truth, eliminating the ambiguous handoffs and the redundant, error-prone work of having engineers reverse-engineer a designer’s vision from a black box.</p>

<p>Ultimately, Intent Prototyping changes the object of our work. It allows us to move beyond creating <strong>pictures of a product</strong> and empowers us to become architects of <strong>blueprints for a system</strong>. With the help of AI, we can finally make the live prototype the primary canvas for ideation, not just a high-effort afterthought.</p>

<h3 id="appendices">Appendices</h3>

<p>You can find the full <strong>Intent Prototyping Starter Kit</strong>, which includes all those prompts and guidelines, as well as the example from this article and a minimal boilerplate project, in this <a href="https://github.com/YegorGilyov/intent-prototyping-starter-kit">GitHub repository</a>.</p>

<div class="js-table-accordion accordion book__toc" id="TOC" aria-multiselectable="true">
    <dl class="accordion-list" style="margin-bottom: 1em" data-handler="Accordion">
          <dt tabindex="0" class="accordion-item" id="accordion-item-0" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 1: Sketch to UML Class Diagram
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-0" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Software Architect specializing in Domain-Driven Design. You are tasked with defining a conceptual model for an app based on information from a UI sketch.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the sketch carefully. There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Generate the conceptual model description in the Mermaid format using a UML class diagram.

&#35;&#35; Ground Rules

- Every entity must have the following attributes:
    - `id` (string)
    - `createdAt` (string, ISO 8601 format)
    - `updatedAt` (string, ISO 8601 format)
- Include all attributes shown in the UI: If a piece of data is visually represented as a field for an entity, include it in the model, even if it's calculated from other attributes.
- Do not add any speculative entities, attributes, or relationships ("just in case"). The model should serve the current sketch's requirements only. 
- Pay special attention to cardinality definitions (e.g., if a relationship is optional on both sides, it cannot be `"1" -- "0..*"`, it must be `"0..1" -- "0..*"`).
- Use only valid syntax in the Mermaid diagram.
- Do not include enumerations in the Mermaid diagram.
- Add comments explaining the purpose of every entity, attribute, and relationship, and their expected behavior (not as a part of the diagram, in the Markdown file).

&#35;&#35; Naming Conventions

- Names should reveal intent and purpose.
- Use PascalCase for entity names.
- Use camelCase for attributes and relationships.
- Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError).

&#35;&#35; Final Instructions

- &#42;&#42;No Assumptions:** Base every detail on visual evidence in the sketch, not on common design patterns. 
- &#42;*Double-Check:** After composing the entire document, read through it to ensure the hierarchy is logical, the descriptions are unambiguous, and the formatting is consistent. The final document should be a self-contained, comprehensive specification. 
- &#42;&#42;Do not add redundant empty lines between items.&#42;&#42; 

Your final output should be the complete, raw markdown content for `Model.md`.
</code></pre>
</div>
</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-1" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 2: Sketch to DAL Spec
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-1" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and Zustand. You are tasked with creating a comprehensive technical specification for the development team in a structured markdown document, based on a UI sketch and a conceptual model description. 

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully:

- `Model.md`: the conceptual model
- `Sketch.png`: the UI sketch

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- `TS-guidelines.md`: TypeScript Best Practices
- `React-guidelines.md`: React Best Practices
- `Zustand-guidelines.md`: Zustand Best Practices

&#42;&#42;Step 3:&#42;&#42; Create a Markdown specification for the stores and entity-specific hook that implements all the logic and provides all required operations.

---

&#35;&#35; Markdown Output Structure

Use this template for the entire document.

```markdown

&#35; Data Access Layer Specification

This document outlines the specification for the data access layer of the application, following the principles defined in `docs/guidelines/Zustand-guidelines.md`.

&#35;&#35; 1. Type Definitions

Location: `src/types/entities.ts`

&#35;&#35;&#35; 1.1. `BaseEntity`

A shared interface that all entities should extend.

[TypeScript interface definition]

&#35;&#35;&#35; 1.2. `[Entity Name]`

The interface for the [Entity Name] entity.

[TypeScript interface definition]

&#35;&#35; 2. Zustand Stores

&#35;&#35;&#35; 2.1. Store for `[Entity Name]`

&#42;&#42;Location:&#42;&#42; `src/stores/[Entity Name (plural)].ts`

The Zustand store will manage the state of all [Entity Name] items.

&#42;&#42;Store State (`[Entity Name]State`):&#42;&#42;

[TypeScript interface definition]

&#42;&#42;Store Implementation (`use[Entity Name]Store`):&#42;&#42;

- The store will be created using `create&lt;[Entity Name]State&gt;()(...)`.
- It will use the `persist` middleware from `zustand/middleware` to save state to `localStorage`. The persistence key will be `[entity-storage-key]`.
- `[Entity Name (plural, camelCase)]` will be a dictionary (`Record&lt;string, [Entity]&gt;`) for O(1) access.

&#42;&#42;Actions:&#42;&#42;

- &#42;&#42;`add[Entity Name]`&#42;&#42;:  
    [Define the operation behavior based on entity requirements]
- &#42;&#42;`update[Entity Name]`&#42;&#42;:  
    [Define the operation behavior based on entity requirements]
- &#42;&#42;`remove[Entity Name]`&#42;&#42;:  
    [Define the operation behavior based on entity requirements]
- &#42;&#42;`doSomethingElseWith[Entity Name]`&#42;&#42;:  
    [Define the operation behavior based on entity requirements]
    
&#35;&#35; 3. Custom Hooks

&#35;&#35;&#35; 3.1. `use[Entity Name (plural)]`

&#42;&#42;Location:&#42;&#42; `src/hooks/use[Entity Name (plural)].ts`

The hook will be the primary interface for UI components to interact with [Entity Name] data.

&#42;&#42;Hook Return Value:&#42;&#42;

[TypeScript interface definition]

&#42;&#42;Hook Implementation:&#42;&#42;

[List all properties and methods returned by this hook, and briefly explain the logic behind them, including data transformations, memoization. Do not write the actual code here.]

```

--- 

&#35;&#35; Final Instructions

- &#42;&#42;No Assumptions:&#42;&#42; Base every detail in the specification on the conceptual model or visual evidence in the sketch, not on common design patterns. 
- &#42;&#42;Double-Check:&#42;&#42; After composing the entire document, read through it to ensure the hierarchy is logical, the descriptions are unambiguous, and the formatting is consistent. The final document should be a self-contained, comprehensive specification. 
- &#42;&#42;Do not add redundant empty lines between items.&#42;&#42; 

Your final output should be the complete, raw markdown content for `DAL.md`.
</code></pre>
</div>
</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-2" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 3: Sketch to UI Spec
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-2" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and the Ant Design library. You are tasked with creating a comprehensive technical specification by translating a UI sketch into a structured markdown document for the development team.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully: 

- `Sketch.png`: the UI sketch
  - Note that red lines, red arrows, and red text within the sketch are annotations for you and should not be part of the final UI design. They provide hints and clarification. Never translate them to UI elements directly.
- `Model.md`: the conceptual model
- `DAL.md`: the Data Access Layer spec

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- `TS-guidelines.md`: TypeScript Best Practices
- `React-guidelines.md`: React Best Practices

&#42;&#42;Step 3:&#42;&#42; Generate the complete markdown content for a new file, `UI.md`.

---

&#35;&#35; Markdown Output Structure

Use this template for the entire document.

```markdown

&#35; UI Layer Specification

This document specifies the UI layer of the application, breaking it down into pages and reusable components based on the provided sketches. All components will adhere to Ant Design's principles and utilize the data access patterns defined in `docs/guidelines/Zustand-guidelines.md`.

&#35;&#35; 1. High-Level Structure

The application is a single-page application (SPA). It will be composed of a main layout, one primary page, and several reusable components. 

&#35;&#35;&#35; 1.1. `App` Component

The root component that sets up routing and global providers.

-   &#42;&#42;Location&#42;&#42;: `src/App.tsx`
-   &#42;&#42;Purpose&#42;&#42;: To provide global context, including Ant Design's `ConfigProvider` and `App` contexts for message notifications, and to render the main page.
-   &#42;&#42;Composition&#42;&#42;:
  -   Wraps the application with `ConfigProvider` and `App as AntApp` from 'antd' to enable global message notifications as per `simple-ice/antd-messages.mdc`.
  -   Renders `[Page Name]`.

&#35;&#35; 2. Pages

&#35;&#35;&#35; 2.1. `[Page Name]`

-   &#42;&#42;Location:&#42;&#42; `src/pages/PageName.tsx`
-   &#42;&#42;Purpose:&#42;&#42; [Briefly describe the main goal and function of this page]
-   &#42;&#42;Data Access:&#42;&#42;
  [List the specific hooks and functions this component uses to fetch or manage its data]
-   &#42;&#42;Internal State:&#42;&#42;
    [Describe any state managed internally by this page using `useState`]
-   &#42;&#42;Composition:&#42;&#42;
    [Briefly describe the content of this page]
-   &#42;&#42;User Interactions:&#42;&#42;
    [Describe how the user interacts with this page] 
-   &#42;&#42;Logic:&#42;&#42;
  [If applicable, provide additional comments on how this page should work]

&#35;&#35; 3. Components

&#35;&#35;&#35; 3.1. `[Component Name]`

-   &#42;&#42;Location:&#42;&#42; `src/components/ComponentName.tsx`
-   &#42;&#42;Purpose:&#42;&#42; [Explain what this component does and where it's used]
-   &#42;&#42;Props:&#42;&#42;
  [TypeScript interface definition for the component's props. Props should be minimal. Avoid prop drilling by using hooks for data access.]
-   &#42;&#42;Data Access:&#42;&#42;
    [List the specific hooks and functions this component uses to fetch or manage its data]
-   &#42;&#42;Internal State:&#42;&#42;
    [Describe any state managed internally by this component using `useState`]
-   &#42;&#42;Composition:&#42;&#42;
    [Briefly describe the content of this component]
-   &#42;&#42;User Interactions:&#42;&#42;
    [Describe how the user interacts with the component]
-   &#42;&#42;Logic:&#42;&#42;
  [If applicable, provide additional comments on how this component should work]
  
```

--- 

&#35;&#35; Final Instructions

- &#42;&#42;No Assumptions:&#42;&#42; Base every detail on the visual evidence in the sketch, not on common design patterns. 
- &#42;&#42;Double-Check:&#42;&#42; After composing the entire document, read through it to ensure the hierarchy is logical, the descriptions are unambiguous, and the formatting is consistent. The final document should be a self-contained, comprehensive specification. 
- &#42;&#42;Do not add redundant empty lines between items.&#42;&#42; 

Your final output should be the complete, raw markdown content for `UI.md`.
</code></pre>
</div>
</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-3" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 4: DAL Spec to Plan
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-3" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and Zustand. You are tasked with creating a plan to build a Data Access Layer for an application based on a spec.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully:

- `DAL.md`: The full technical specification for the Data Access Layer of the application. Follow it carefully and to the letter.

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- `TS-guidelines.md`: TypeScript Best Practices
- `React-guidelines.md`: React Best Practices
- `Zustand-guidelines.md`: Zustand Best Practices

&#42;&#42;Step 3:&#42;&#42; Create a step-by-step plan to build a Data Access Layer according to the spec. 

Each task should:

- Focus on one concern
- Be reasonably small
- Have a clear start + end
- Contain clearly defined Objectives and Acceptance Criteria

The last step of the plan should include creating a page to test all the capabilities of our Data Access Layer, and making it the start page of this application, so that I can manually check if it works properly. 

I will hand this plan over to an engineering LLM that will be told to complete one task at a time, allowing me to review results in between.

&#35;&#35; Final Instructions
 
- Note that we are not starting from scratch; the basic template has already been created using Vite.
- Do not add redundant empty lines between items.

Your final output should be the complete, raw markdown content for `DAL-plan.md`.
</code></pre>
</div></p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 5: UI Spec to Plan
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and the Ant Design library. You are tasked with creating a plan to build a UI layer for an application based on a spec and a sketch.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully:

- `UI.md`: The full technical specification for the UI layer of the application. Follow it carefully and to the letter.
- `Sketch.png`: Contains important information about the layout and style, complements the UI Layer Specification. The final UI must be as close to this sketch as possible.

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- `TS-guidelines.md`: TypeScript Best Practices
- `React-guidelines.md`: React Best Practices

&#42;&#42;Step 3:&#42;&#42; Create a step-by-step plan to build a UI layer according to the spec and the sketch. 

Each task must:

- Focus on one concern.
- Be reasonably small.
- Have a clear start + end.
- Result in a verifiable increment of the application. Each increment should be manually testable to allow for functional review and approval before proceeding.
- Contain clearly defined Objectives, Acceptance Criteria, and Manual Testing Plan.

I will hand this plan over to an engineering LLM that will be told to complete one task at a time, allowing me to test in between.

&#35;&#35; Final Instructions

- Note that we are not starting from scratch, the basic template has already been created using Vite, and the Data Access Layer has been built successfully.
- For every task, describe how components should be integrated for verification. You must use the provided hooks to connect to the live Zustand store data—do not use mock data (note that the Data Access Layer has been already built successfully).
- The Manual Testing Plan should read like a user guide. It must only contain actions a user can perform in the browser and must never reference any code files or programming tasks.
- Do not add redundant empty lines between items.

Your final output should be the complete, raw markdown content for `UI-plan.md`.
</code></pre>
</div>
</p>
             </div>
         </dd>         
         <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 6: DAL Plan to Code
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and Zustand. You are tasked with building a Data Access Layer for an application based on a spec.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully:

- @docs/specs/DAL.md: The full technical specification for the Data Access Layer of the application. Follow it carefully and to the letter. 

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- @docs/guidelines/TS-guidelines.md: TypeScript Best Practices
- @docs/guidelines/React-guidelines.md: React Best Practices
- @docs/guidelines/Zustand-guidelines.md: Zustand Best Practices

&#42;&#42;Step 3:&#42;&#42; Read the plan:

- @docs/plans/DAL-plan.md: The step-by-step plan to build the Data Access Layer of the application.

&#42;&#42;Step 4:&#42;&#42; Build a Data Access Layer for this application according to the spec and following the plan. 

- Complete one task from the plan at a time. 
- After each task, stop, so that I can test it. Don’t move to the next task before I tell you to do so. 
- Do not do anything else. At this point, we are focused on building the Data Access Layer.

&#35;&#35; Final Instructions

- Do not make assumptions based on common patterns; always verify them with the actual data from the spec and the sketch. 
- Do not start the development server, I'll do it by myself.
</code></pre>
</div></p>
             </div>
         </dd>
         <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 7: UI Plan to Code
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">You are an expert Senior Frontend Developer specializing in React, TypeScript, and the Ant Design library. You are tasked with building a UI layer for an application based on a spec and a sketch.

&#35;&#35; Workflow

Follow these steps precisely:

&#42;&#42;Step 1:&#42;&#42; Analyze the documentation carefully:

- @docs/specs/UI.md: The full technical specification for the UI layer of the application. Follow it carefully and to the letter.
- @docs/intent/Sketch.png: Contains important information about the layout and style, complements the UI Layer Specification. The final UI must be as close to this sketch as possible.
- @docs/specs/DAL.md: The full technical specification for the Data Access Layer of the application. That layer is already ready. Use this spec to understand how to work with it. 

There should be no ambiguity about what we are building.

&#42;&#42;Step 2:&#42;&#42; Check out the guidelines:

- @docs/guidelines/TS-guidelines.md: TypeScript Best Practices
- @docs/guidelines/React-guidelines.md: React Best Practices

&#42;&#42;Step 3:&#42;&#42; Read the plan:

- @docs/plans/UI-plan.md: The step-by-step plan to build the UI layer of the application.

&#42;&#42;Step 4:&#42;&#42; Build a UI layer for this application according to the spec and the sketch, following the step-by-step plan: 

- Complete one task from the plan at a time. 
- Make sure you build the UI according to the sketch; this is very important.
- After each task, stop, so that I can test it. Don’t move to the next task before I tell you to do so. 

&#35;&#35; Final Instructions

- Do not make assumptions based on common patterns; always verify them with the actual data from the spec and the sketch. 
- Follow Ant Design's default styles and components. 
- Do not touch the data access layer: it's ready and it's perfect. 
- Do not start the development server, I'll do it by myself.
</code></pre>
</div></p>
             </div>
         </dd>
         <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 8: TS-guidelines.md
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">&#35; Guidelines: TypeScript Best Practices

&#35;&#35; Type System & Type Safety

- Use TypeScript for all code and enable strict mode.
- Ensure complete type safety throughout stores, hooks, and component interfaces.
- Prefer interfaces over types for object definitions; use types for unions, intersections, and mapped types.
- Entity interfaces should extend common patterns while maintaining their specific properties.
- Use TypeScript type guards in filtering operations for relationship safety.
- Avoid the 'any' type; prefer 'unknown' when necessary.
- Use generics to create reusable components and functions.
- Utilize TypeScript's features to enforce type safety.
- Use type-only imports (import type { MyType } from './types') when importing types, because verbatimModuleSyntax is enabled.
- Avoid enums; use maps instead.

&#35;&#35; Naming Conventions

- Names should reveal intent and purpose.
- Use PascalCase for component names and types/interfaces.
- Prefix interfaces for React props with 'Props' (e.g., ButtonProps).
- Use camelCase for variables and functions.
- Use UPPER_CASE for constants.
- Use lowercase with dashes for directories, and PascalCase for files with components (e.g., components/auth-wizard/AuthForm.tsx).
- Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError).
- Favor named exports for components.

&#35;&#35; Code Structure & Patterns

- Write concise, technical TypeScript code with accurate examples.
- Use functional and declarative programming patterns; avoid classes.
- Prefer iteration and modularization over code duplication.
- Use the "function" keyword for pure functions.
- Use curly braces for all conditionals for consistency and clarity.
- Structure files appropriately based on their purpose.
- Keep related code together and encapsulate implementation details.

&#35;&#35; Performance & Error Handling

- Use immutable and efficient data structures and algorithms.
- Create custom error types for domain-specific errors.
- Use try-catch blocks with typed catch clauses.
- Handle Promise rejections and async errors properly.
- Log errors appropriately and handle edge cases gracefully.

&#35;&#35; Project Organization

- Place shared types in a types directory.
- Use barrel exports (index.ts) for organizing exports.
- Structure files and directories based on their purpose.

&#35;&#35; Other Rules

- Use comments to explain complex logic or non-obvious decisions.
- Follow the single responsibility principle: each function should do exactly one thing.
- Follow the DRY (Don't Repeat Yourself) principle.
- Do not implement placeholder functions, empty methods, or "just in case" logic. Code should serve the current specification's requirements only.
- Use 2 spaces for indentation (no tabs).
</code></pre>
</div></p>
             </div>
         </dd>
         <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 9: React-guidelines.md
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">&#35; Guidelines: React Best Practices

&#35;&#35; Component Structure

- Use functional components over class components
- Keep components small and focused
- Extract reusable logic into custom hooks
- Use composition over inheritance
- Implement proper prop types with TypeScript
- Structure React files: exported component, subcomponents, helpers, static content, types
- Use declarative TSX for React components
- Ensure that UI components use custom hooks for data fetching and operations rather than receive data via props, except for simplest components

&#35;&#35; React Patterns

- Utilize useState and useEffect hooks for state and side effects
- Use React.memo for performance optimization when needed
- Utilize React.lazy and Suspense for code-splitting
- Implement error boundaries for robust error handling
- Keep styles close to components

&#35;&#35; React Performance

- Avoid unnecessary re-renders
- Lazy load components and images when possible
- Implement efficient state management
- Optimize rendering strategies
- Optimize network requests
- Employ memoization techniques (e.g., React.memo, useMemo, useCallback)

&#35;&#35; React Project Structure

```
/src
- /components - UI components (every component in a separate file)
- /hooks - public-facing custom hooks (every hook in a separate file)
- /providers - React context providers (every provider in a separate file)
- /pages - page components (every page in a separate file)
- /stores - entity-specific Zustand stores (every store in a separate file)
- /styles - global styles (if needed)
- /types - shared TypeScript types and interfaces
```
</code></pre>
</div></p>
             </div>
         </dd>
         <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Appendix 10: Zustand-guidelines.md
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd style="max-height: none;" class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p><div class="break-out">
<pre><code class="language-markdown">&#35; Guidelines: Zustand Best Practices

&#35;&#35; Core Principles

- &#42;&#42;Implement a data layer&#42;&#42; for this React application following this specification carefully and to the letter.
- &#42;&#42;Complete separation of concerns&#42;&#42;: All data operations should be accessible in UI components through simple and clean entity-specific hooks, ensuring state management logic is fully separated from UI logic.
- &#42;&#42;Shared state architecture&#42;&#42;: Different UI components should work with the same shared state, despite using entity-specific hooks separately.

&#35;&#35; Technology Stack

- &#42;&#42;State management&#42;&#42;: Use Zustand for state management with automatic localStorage persistence via the `persist` middleware.

&#35;&#35; Store Architecture

- &#42;&#42;Base entity:&#42;&#42; Implement a BaseEntity interface with common properties that all entities extend:
```typescript 
export interface BaseEntity { 
  id: string; 
  createdAt: string; // ISO 8601 format 
  updatedAt: string; // ISO 8601 format 
}
```
- &#42;&#42;Entity-specific stores&#42;&#42;: Create separate Zustand stores for each entity type.
- &#42;&#42;Dictionary-based storage&#42;&#42;: Use dictionary/map structures (`Record<string, Entity>`) rather than arrays for O(1) access by ID.
- &#42;&#42;Handle relationships&#42;&#42;: Implement cross-entity relationships (like cascade deletes) within the stores where appropriate.

&#35;&#35; Hook Layer

The hook layer is the exclusive interface between UI components and the Zustand stores. It is designed to be simple, predictable, and follow a consistent pattern across all entities.

&#35;&#35;&#35; Core Principles

1.  &#42;&#42;One Hook Per Entity&#42;&#42;: There will be a single, comprehensive custom hook for each entity (e.g., `useBlogPosts`, `useCategories`). This hook is the sole entry point for all data and operations related to that entity. Separate hooks for single-item access will not be created.
2.  &#42;&#42;Return reactive data, not getter functions&#42;&#42;: To prevent stale data, hooks must return the state itself, not a function that retrieves state. Parameterize hooks to accept filters and return the derived data directly. A component calling a getter function will not update when the underlying data changes.
3.  &#42;&#42;Expose Dictionaries for O(1) Access&#42;&#42;: To provide simple and direct access to data, every hook will return a dictionary (`Record<string, Entity>`) of the relevant items.

&#35;&#35;&#35; The Standard Hook Pattern

Every entity hook will follow this implementation pattern:

1.  &#42;&#42;Subscribe&#42;&#42; to the entire dictionary of entities from the corresponding Zustand store. This ensures the hook is reactive to any change in the data.
2.  &#42;&#42;Filter&#42;&#42; the data based on the parameters passed into the hook. This logic will be memoized with `useMemo` for efficiency. If no parameters are provided, the hook will operate on the entire dataset.
3.  &#42;&#42;Return a Consistent Shape&#42;&#42;: The hook will always return an object containing:
    &#42;   A &#42;&#42;filtered and sorted array&#42;&#42; (e.g., `blogPosts`) for rendering lists.
    &#42;   A &#42;&#42;filtered dictionary&#42;&#42; (e.g., `blogPostsDict`) for convenient `O(1)` lookup within the component.
    &#42;   All necessary &#42;&#42;action functions&#42;&#42; (`add`, `update`, `remove`) and &#42;&#42;relationship operations&#42;&#42;.
    &#42;   All necessary &#42;&#42;helper functions&#42;&#42; and &#42;&#42;derived data objects&#42;&#42;. Helper functions are suitable for pure, stateless logic (e.g., calculators). Derived data objects are memoized values that provide aggregated or summarized information from the state (e.g., an object containing status counts). They must be derived directly from the reactive state to ensure they update automatically when the underlying data changes.

&#35;&#35; API Design Standards

- &#42;&#42;Object Parameters&#42;&#42;: Use object parameters instead of multiple direct parameters for better extensibility:
```typescript

// ✅ Preferred

add({ title, categoryIds })

// ❌ Avoid

add(title, categoryIds)

```
- &#42;&#42;Internal Methods&#42;&#42;: Use underscore-prefixed methods for cross-store operations to maintain clean separation.

&#35;&#35; State Validation Standards

- &#42;&#42;Existence checks&#42;&#42;: All `update` and `remove` operations should validate entity existence before proceeding.
- &#42;&#42;Relationship validation&#42;&#42;: Verify both entities exist before establishing relationships between them.

&#35;&#35; Error Handling Patterns

- &#42;&#42;Operation failures&#42;&#42;: Define behavior when operations fail (e.g., updating non-existent entities).
- &#42;&#42;Graceful degradation&#42;&#42;: How to handle missing related entities in helper functions.

&#35;&#35; Other Standards

- &#42;&#42;Secure ID generation&#42;&#42;: Use `crypto.randomUUID()` for entity ID generation instead of custom implementations for better uniqueness guarantees and security.
- &#42;&#42;Return type consistency&#42;&#42;: `add` operations return generated IDs for component workflows requiring immediate entity access, while `update` and `remove` operations return `void` to maintain clean modification APIs.
</code></pre>
</div></p>
             </div>
         </dd>    
    <span></span></dl>
</div>
                

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Yegor Gilyov</author><title>Intent Prototyping: The Allure And Danger Of Pure Vibe Coding In Enterprise UX (Part 1)</title><link>https://www.smashingmagazine.com/2025/09/intent-prototyping-pure-vibe-coding-enterprise-ux/</link><pubDate>Wed, 24 Sep 2025 17:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2025/09/intent-prototyping-pure-vibe-coding-enterprise-ux/</guid><description>Yegor Gilyov examines the problem of over-reliance on static high-fidelity mockups, which often leave the conceptual model and user flows dangerously underdeveloped. He then explores whether AI-powered prototyping is the answer, questioning whether the path forward is the popular “vibe coding” approach or a more structured, intent-driven approach.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2025/09/intent-prototyping-pure-vibe-coding-enterprise-ux/" />
              <title>Intent Prototyping: The Allure And Danger Of Pure Vibe Coding In Enterprise UX (Part 1)</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Intent Prototyping: The Allure And Danger Of Pure Vibe Coding In Enterprise UX (Part 1)</h1>
                  
                    
                    <address>Yegor Gilyov</address>
                  
                  <time datetime="2025-09-24T17:00:00&#43;00:00" class="op-published">2025-09-24T17:00:00+00:00</time>
                  <time datetime="2025-09-24T17:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>There is a spectrum of opinions on how dramatically all creative professions will be changed by the coming wave of agentic AI, from the very skeptical to the wildly optimistic and even apocalyptic. I think that even if you are on the “skeptical” end of the spectrum, it makes sense to explore ways this new technology can help with your everyday work. As for my everyday work, I’ve been doing UX and product design for about 25 years now, and I’m always keen to learn new tricks and share them with colleagues. Right now, I’m interested in <strong>AI-assisted prototyping</strong>, and I’m here to share my thoughts on how it can change the process of designing digital products.</p>

<p>To set your expectations up front: this exploration focuses on a specific part of the product design lifecycle. Many people know about the Double Diamond framework, which shows the path from problem to solution. However, I think it’s the <a href="https://uxdesign.cc/why-the-double-diamond-isnt-enough-adaa48a8aec1">Triple Diamond model</a> that makes an important point for our needs. It explicitly separates the solution space into two phases: Solution Discovery (ideating and validating the right concept) and Solution Delivery (engineering the validated concept into a final product). This article is focused squarely on that middle diamond: <strong>Solution Discovery</strong>.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="593"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png"
			
			sizes="100vw"
			alt="Diagram of the Triple Diamond model: Problem Discovery, Solution Discovery, and Solution Delivery."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The Triple Diamond model and the prototyping sweet spot. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/01-diagram-triple-diamond-model.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>How AI can help with the preceding (Problem Discovery) and the following (Solution Delivery) stages is out of the scope of this article. Problem Discovery is less about prototyping and more about research, and while I believe AI can revolutionize the research process as well, I’ll leave that to people more knowledgeable in the field. As for Solution Delivery, it is more about engineering optimization. There’s no doubt that software engineering in the AI era is undergoing dramatic changes, but I’m not an engineer &mdash; I’m a designer, so let me focus on my “sweet spot”.</p>

<p>And my “sweet spot” has a specific flavor: <strong>designing enterprise applications</strong>. In this world, the main challenge is taming complexity: dealing with complicated data models and guiding users through non-linear workflows. This background has had a big impact on my approach to design, putting a lot of emphasis on the underlying logic and structure. This article explores the potential of AI through this lens.</p>

<p>I’ll start by outlining the typical artifacts designers create during Solution Discovery. Then, I’ll examine the problems with how this part of the process often plays out in practice. Finally, we’ll explore whether AI-powered prototyping can offer a better approach, and if so, whether it aligns with what people call “vibe coding,” or calls for a more deliberate and disciplined way of working.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="what-we-create-during-solution-discovery">What We Create During Solution Discovery</h2>

<p>The Solution Discovery phase begins with the key output from the preceding research: <strong>a well-defined problem</strong> and <strong>a core hypothesis for a solution</strong>. This is our starting point. The artifacts we create from here are all aimed at turning that initial hypothesis into a tangible, testable concept.</p>

<p>Traditionally, at this stage, designers can produce artifacts of different kinds, progressively increasing fidelity: from napkin sketches, boxes-and-arrows, and conceptual diagrams to hi-fi mockups, then to interactive prototypes, and in some cases even live prototypes. Artifacts of lower fidelity allow fast iteration and enable the exploration of many alternatives, while artifacts of higher fidelity help to understand, explain, and validate the concept in all its details.</p>

<p>It’s important to <strong>think holistically</strong>, considering different aspects of the solution. I would highlight three dimensions:</p>

<ol>
<li><strong>Conceptual model</strong>: Objects, relations, attributes, actions;</li>
<li><strong>Visualization</strong>: Screens, from rough sketches to hi-fi mockups;</li>
<li><strong>Flow</strong>: From the very high-level user journeys to more detailed ones.</li>
</ol>

<p>One can argue that those are layers rather than dimensions, and each of them builds on the previous ones (for example, according to <a href="https://www.interaction-design.org/literature/article/the-magic-of-semantic-interaction-design?srsltid=AfmBOoq4-4YG8RR7SDZn7CX1GJ1ZKNdiZx-trER7oKCefud3V2TjeumD">Semantic IxD</a> by Daniel Rosenberg), but I see them more as different facets of the same thing, so the design process through them is not necessarily linear: you may need to switch from one perspective to another many times.</p>

<p>This is how different types of design artifacts map to these dimensions:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="596"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png"
			
			sizes="100vw"
			alt="Diagram mapping design artifacts to dimensions of Conceptual Model, Visualization, and Flow."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Mapping design artifacts to dimensions of Conceptual Model, Visualization, and Flow. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/02-mapping-design-artifacts.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>As Solution Discovery progresses, designers move from the left part of this map to the right, from low-fidelity to high-fidelity, from ideating to validating, from diverging to converging.</p>

<p>Note that at the beginning of the process, different dimensions are supported by artifacts of different types (boxes-and-arrows, sketches, class diagrams, etc.), and only closer to the end can you build a live prototype that encompasses all three dimensions: conceptual model, visualization, and flow.</p>

<p>This progression shows a classic trade-off, like the difference between a pencil drawing and an oil painting. The drawing lets you explore ideas in the most flexible way, whereas the painting has a lot of detail and overall looks much more realistic, but is hard to adjust. Similarly, as we go towards artifacts that integrate all three dimensions at higher fidelity, our ability to iterate quickly and explore divergent ideas goes down. This inverse relationship has long been an accepted, almost unchallenged, limitation of the design process.</p>

<h2 id="the-problem-with-the-mockup-centric-approach">The Problem With The Mockup-Centric Approach</h2>

<p>Faced with this difficult trade-off, often teams opt for the easiest way out. On the one hand, they need to show that they are making progress and create things that appear detailed. On the other hand, they rarely can afford to build interactive or live prototypes. This leads them to over-invest in one type of artifact that seems to offer the best of both worlds. As a result, the neatly organized “bento box” of design artifacts we saw previously gets shrunk down to just one compartment: creating static high-fidelity mockups.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="388"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png"
			
			sizes="100vw"
			alt="The artifact map diagram, with “Hi-fi Mockup” enlarged to show an over-reliance on it."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The mockup-centric approach. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/03-artifact-map-diagram.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This choice is understandable, as several forces push designers in this direction. Stakeholders are always eager to see nice pictures, while artifacts representing user flows and conceptual models receive much less attention and priority. They are too high-level and hardly usable for validation, and usually, not everyone can understand them.</p>

<p>On the other side of the fidelity spectrum, interactive prototypes require too much effort to create and maintain, and creating live prototypes in code used to require special skills (and again, effort). And even when teams make this investment, they do so at the end of Solution Discovery, during the convergence stage, when it is often too late to experiment with fundamentally different ideas. With so much effort already sunk, there is little appetite to go back to the drawing board.</p>

<p>It’s no surprise, then, that many teams default to the perceived safety of <strong>static mockups</strong>, seeing them as a middle ground between the roughness of the sketches and the overwhelming complexity and fragility that prototypes can have.</p>

<p>As a result, validation with users doesn’t provide enough confidence that the solution will actually solve the problem, and teams are forced to make a leap of faith to start building. To make matters worse, they do so without a clear understanding of the conceptual model, the user flows, and the interactions, because from the very beginning, designers’ attention has been heavily skewed toward visualization.</p>

<p>The result is often a design artifact that resembles the famous “horse drawing” meme: beautifully rendered in the parts everyone sees first (the mockups), but dangerously underdeveloped in its underlying structure (the conceptual model and flows).</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="541"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg"
			
			sizes="100vw"
			alt="The “horse drawing” meme, where the front is detailed and the back is a simple sketch."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The “lopsided horse” problem. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/04-lopsided-horse-problem.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>While this is a familiar problem across the industry, its severity <strong>depends on the nature of the project</strong>. If your core challenge is to optimize a well-understood, linear flow (like many B2C products), a mockup-centric approach can be perfectly adequate. The risks are contained, and the “lopsided horse” problem is unlikely to be fatal.</p>

<p>However, it’s different for the systems I specialize in: complex applications defined by intricate data models and non-linear, interconnected user flows. Here, the biggest risks are not on the surface but in the underlying structure, and a lack of attention to the latter would be a recipe for disaster.</p>

<div class="partners__lead-place"></div>

<h2 id="transforming-the-design-process">Transforming The Design Process</h2>

<p>This situation makes me wonder:</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aHow%20might%20we%20close%20the%20gap%20between%20our%20design%20intent%20and%20a%20live%20prototype,%20so%20that%20we%20can%20iterate%20on%20real%20functionality%20from%20day%20one?%0a&url=https://smashingmagazine.com%2f2025%2f09%2fintent-prototyping-pure-vibe-coding-enterprise-ux%2f">
      
How might we close the gap between our design intent and a live prototype, so that we can iterate on real functionality from day one?

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="397"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png"
			
			sizes="100vw"
			alt="Diagram showing bridging the gap between “Design Intent” and “Live Prototype.”"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      How might we bridge the gap between design intent and a live prototype? (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/05-design-intent-live-prototype.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>If we were able to answer this question, we would:</p>

<ul>
<li><strong>Learn faster.</strong><br />
By going straight from intent to a testable artifact, we cut the feedback loop from weeks to days.</li>
<li><strong>Gain more confidence.</strong><br />
Users interact with real logic, which gives us more proof that the idea works.</li>
<li><strong>Enforce conceptual clarity.</strong><br />
A live prototype cannot hide a flawed or ambiguous conceptual model.</li>
<li><strong>Establish a clear and lasting source of truth.</strong><br />
A live prototype, combined with a clearly documented design intent, provides the engineering team with an unambiguous specification.</li>
</ul>

<p>Of course, the desire for such a process is not new. This vision of a truly <strong>prototype-driven workflow</strong> is especially compelling for enterprise applications, where the benefits of faster learning and forced conceptual clarity are the best defense against costly structural flaws. But this ideal was still out of reach because prototyping in code took so much work and specialized talents. Now, the rise of powerful AI coding assistants changes this equation in a big way.</p>

<h2 id="the-seductive-promise-of-vibe-coding">The Seductive Promise Of “Vibe Coding”</h2>

<p>And the answer seems to be obvious: <strong>vibe coding</strong>!</p>

<blockquote>“Vibe coding is an artificial intelligence-assisted software development style popularized by Andrej Karpathy in early 2025. It describes a fast, improvisational, collaborative approach to creating software where the developer and a large language model (LLM) tuned for coding is acting rather like pair programmers in a conversational loop.”<br /><br />&mdash; <a href="https://en.wikipedia.org/wiki/Vibe_coding">Wikipedia</a></blockquote>

<p>The original tweet by Andrej Karpathy:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://x.com/karpathy/status/1886192184808149383">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="552"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png"
			
			sizes="100vw"
			alt="Screenshot of Andrej Karpathy&#39;s tweet defining Vibe Coding."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Andrej Karpathy’s tweet that popularized the term “vibe coding”. (Image source: <a href='https://x.com/karpathy/status/1886192184808149383'>X</a>) (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/06-andrej-karpathy-tweet.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The allure of this approach is undeniable. If you are not a developer, you are bound to feel awe when you describe a solution in plain language, and moments later, you can interact with it. This seems to be the ultimate fulfillment of our goal: a direct, frictionless path from an idea to a live prototype. But <strong>is this method reliable enough</strong> to build our new design process around it?</p>

<h3 id="the-trap-a-process-without-a-blueprint">The Trap: A Process Without A Blueprint</h3>

<p>Vibe coding mixes up a description of the UI with a description of the system itself, resulting in a <strong>prototype based on changing assumptions rather than a clear, solid model</strong>.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aThe%20pitfall%20of%20vibe%20coding%20is%20that%20it%20encourages%20us%20to%20express%20our%20intent%20in%20the%20most%20ambiguous%20way%20possible:%20by%20having%20a%20conversation.%0a&url=https://smashingmagazine.com%2f2025%2f09%2fintent-prototyping-pure-vibe-coding-enterprise-ux%2f">
      
The pitfall of vibe coding is that it encourages us to express our intent in the most ambiguous way possible: by having a conversation.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>This is like hiring a builder and telling them what to do one sentence at a time without ever presenting them a blueprint. They could make a wall that looks great, but you can’t be sure that it can hold weight.</p>

<p>I’ll give you one example illustrating problems you may face if you try to jump over the chasm between your idea and a live prototype relying on pure vibe coding in the spirit of Andrej Karpathy’s tweet. Imagine I want to prototype a solution to keep track of tests to validate product ideas. I open my vibe coding tool of choice (I intentionally don’t disclose its name, as I believe they all are awesome yet prone to similar pitfalls) and start with the following prompt:</p>

<div class="break-out">
<pre><code class="language-markdown">I need an app to track tests. For every test, I need to fill out the following data:
- Hypothesis (we believe that...) 
- Experiment (to verify that, we will...)
- When (a single date, or a period) 
- Status (New/Planned/In Progress/Proven/Disproven)
</code></pre>
</div>

<p>And in a minute or so, I get a working prototype:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="610"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png"
			
			sizes="100vw"
			alt="Screenshot of a simple Test Tracker app."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The initial prototype. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/7-test-tracker.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Inspired by success, I go further:</p>

<div class="break-out">
<pre><code class="language-markdown">Please add the ability to specify a product idea for every test. Also, I want to filter tests by product ideas and see how many tests each product idea has in each status.
</code></pre>
</div>

<p>And the result is still pretty good:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="610"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png"
			
			sizes="100vw"
			alt="The Test Tracker app screenshot, now with filtering by product ideas."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The prototype updated to include filtering tests by product ideas. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/8-test-tracker-updated.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>But then I want to extend the functionality related to product ideas:</p>

<div class="break-out">
<pre><code class="language-markdown">Okay, one more thing. For every product idea, I want to assess the impact score, the confidence score, and the ease score, and get the overall ICE score. Perhaps I need a separate page focused on the product idea, with all the relevant information and related tests.
</code></pre>
</div>

<p>And from this point on, the results are getting more and more confusing.</p>

<p>The flow of creating tests hasn’t changed much. I can still create a bunch of tests, and they seem to be organized by product ideas. But when I click “Product Ideas” in the top navigation, I see nothing:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="518"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png"
			
			sizes="100vw"
			alt="Screenshot of the app’s blank Product Ideas page."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The Product Ideas page is empty. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/9-product-ideas-page.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>I need to create my ideas from scratch, and they are not connected to the tests I created before:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="519"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png"
			
			sizes="100vw"
			alt="Screenshot of the Product Ideas page with newly created ideas not connected to tests."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The newly created product ideas are disconnected from existing tests. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/10-product-ideas-disconnected-tests.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Moreover, when I go back to “Tests”, I see that they are all gone. Clearly something went wrong, and my AI assistant confirms that:</p>

<blockquote>No, this is not expected behavior &mdash; it’s a bug! The issue is that tests are being stored in two separate places (local state in the Index page and App state), so tests created on the main page don’t sync with the product ideas page.</blockquote>

<p>Sure, eventually it fixed that bug, but note that we encountered this just on the third step, when we asked to slightly extend the functionality of a very simple app. The more layers of complexity we add, the more roadblocks of this sort we are bound to face.</p>

<p>Also note that this specific problem of a not fully thought-out relationship between two entities (product ideas and tests) is not isolated at the technical level, and therefore, it didn’t go away once the technical bug was fixed. The underlying conceptual model is still broken, and it manifests in the UI as well.</p>

<p>For example, you can still create “orphan” tests that are not connected to any item from the “Product Ideas” page. As a result, you may end up with different numbers of ideas and tests on different pages of the app:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="305"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png"
			
			sizes="100vw"
			alt="Diagram showing conflicting data between the Tests page and the Product Ideas page."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A poorly defined conceptual model leads to data inconsistencies across the app. (<a href='https://files.smashing.media/articles/intent-prototyping-pure-vibe-coding-enterprise-ux/11-conflicting-data-tests-product-ideas-page.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Let’s diagnose what really happened here. The AI’s response that this is a “bug” is only half the story. The true root cause is a <strong>conceptual model failure</strong>. My prompts never explicitly defined the relationship between product ideas and tests. The AI was forced to guess, which led to the broken experience. For a simple demo, this might be a fixable annoyance. But for a data-heavy enterprise application, this kind of structural ambiguity is fatal. It demonstrates <strong>the fundamental weakness of building without a blueprint</strong>, which is precisely what vibe coding encourages.</p>

<p>Don’t take this as a criticism of vibe coding tools. They are creating real magic. However, the fundamental truth about “garbage in, garbage out” is still valid. If you don’t express your intent clearly enough, chances are the result won’t fulfill your expectations.</p>

<p>Another problem worth mentioning is that even if you wrestle it into a state that works, <strong>the artifact is a black box</strong> that can hardly serve as reliable specifications for the final product. The initial meaning is lost in the conversation, and all that’s left is the end result. This makes the development team “code archaeologists,” who have to figure out what the designer was thinking by reverse-engineering the AI’s code, which is frequently very complicated. Any speed gained at the start is lost right away because of this friction and uncertainty.</p>

<div class="partners__lead-place"></div>

<h2 id="from-fast-magic-to-a-solid-foundation">From Fast Magic To A Solid Foundation</h2>

<p>Pure vibe coding, for all its allure, encourages building without a blueprint. As we’ve seen, this results in <strong>structural ambiguity</strong>, which is not acceptable when designing complex applications. We are left with a seemingly quick but fragile process that creates a black box that is difficult to iterate on and even more so to hand off.</p>

<p>This leads us back to our main question: how might we close the gap between our design intent and a live prototype, so that we can iterate on real functionality from day one, without getting caught in the ambiguity trap? The answer lies in a more methodical, disciplined, and therefore trustworthy process.</p>

<p>In <a href="https://www.smashingmagazine.com/2025/10/intent-prototyping-practical-guide-building-clarity/"><strong>Part 2</strong></a> of this series, “A Practical Guide to Building with Clarity”, I will outline the entire workflow for <strong>Intent Prototyping.</strong> This method places the explicit <em>intent</em> of the designer at the forefront of the process while embracing the potential of AI-assisted coding.</p>

<p>Thank you for reading, and I look forward to seeing you in <a href="https://www.smashingmagazine.com/2025/10/intent-prototyping-practical-guide-building-clarity/"><strong>Part 2</strong></a>.</p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Are Halland</author><title>The Core Model: Start FROM The Answer, Not WITH The Solution</title><link>https://www.smashingmagazine.com/2025/07/core-model-start-from-answer-not-solution/</link><pubDate>Wed, 30 Jul 2025 13:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2025/07/core-model-start-from-answer-not-solution/</guid><description>The Core Model is a practical methodology that flips traditional digital development on its head. Instead of starting with solutions or structure, we begin with a hypothesis about what users need and follow a simple framework that brings diverse teams together to create more effective digital experiences. By asking six good questions in the right order, teams align around user tasks and business objectives, creating clarity that transcends organizational boundaries.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2025/07/core-model-start-from-answer-not-solution/" />
              <title>The Core Model: Start FROM The Answer, Not WITH The Solution</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>The Core Model: Start FROM The Answer, Not WITH The Solution</h1>
                  
                    
                    <address>Are Halland</address>
                  
                  <time datetime="2025-07-30T13:00:00&#43;00:00" class="op-published">2025-07-30T13:00:00+00:00</time>
                  <time datetime="2025-07-30T13:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>Ever sat in a meeting where everyone jumped straight to solutions? “We need a new app!” “Let’s redesign the homepage!” “AI will fix everything!” This solution-first thinking is endemic in digital development &mdash; and it’s why so many projects fail to deliver real value. As the creator of the Core Model methodology, I developed this approach to flip the script: <strong>instead of starting with solutions, we start FROM the answer</strong>.</p>

<p>What’s the difference? Starting with solutions means imposing our preconceived ideas. Starting FROM the answer to a user task means forming a hypothesis about what users need, then taking a step back to follow a simple structure that validates and refines that hypothesis.</p>

<h2 id="six-good-questions-that-lead-to-better-answers">Six Good Questions That Lead to Better Answers</h2>

<p>At its heart, the Core Model is simply six good questions asked in the right order, with a seventh that drives action. It appeals to common sense &mdash; something often in short supply during complex digital projects.</p>

<p>When I introduced this approach to a large organization struggling with their website, their head of digital admitted: <em>“We’ve been asking all these questions separately, but never in this structured way that connects them.”</em></p>

<p>These questions help teams pause, align around what matters, and create solutions that actually work:</p>

<ol>
<li>Who are we trying to help, and what’s their situation?</li>
<li>What are they trying to accomplish?</li>
<li>What do we want to achieve?</li>
<li>How do they approach this need?</li>
<li>Where should they go next?</li>
<li>What’s the essential content or functionality they need?</li>
<li>What needs to be done to create this solution?</li>
</ol>

<p>This simple framework creates clarity across team boundaries, bringing together content creators, designers, developers, customer service, subject matter experts, and leadership around a shared understanding.</p>

<h2 id="starting-with-a-hypothesis">Starting With a Hypothesis</h2>

<p>The Core Model process typically begins before the workshop. The project lead or facilitator works with key stakeholders to:</p>

<ol>
<li>Identify candidate cores based on organizational priorities and user needs.</li>
<li>Gather existing user insights and business objectives.</li>
<li>Form initial hypotheses about what these cores should accomplish.</li>
<li>Prepare relevant background materials for workshop participants.</li>
</ol>

<p>This preparation ensures the workshop itself is focused and productive, with teams validating and refining hypotheses rather than starting from scratch.</p>

<h2 id="the-core-model-six-elements-that-create-alignment">The Core Model: Six Elements That Create Alignment</h2>

<p>Let’s explore each element of the Core Model in detail:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="453"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png"
			
			sizes="100vw"
			alt="The Core Model framework"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The Core Model framework with its six elements: Target Group, User Tasks, Business Objectives, Inward Paths, Forward Paths, and Core Content. (<a href='https://files.smashing.media/articles/core-model-start-from-answer-not-solution/1-core-model-framework.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="1-target-group-building-empathy-first">1. Target Group: Building Empathy First</h3>

<p>Rather than detailed personas, the Core Model starts with quick proto-personas that build empathy for users in specific situations:</p>

<ul>
<li>A parent researching childcare options late at night after a long day.</li>
<li>A small business owner trying to understand tax requirements between client meetings.</li>
<li>A new resident navigating unfamiliar public services in their second language.</li>
</ul>

<p>The key is to humanize users and understand their emotional and practical context before diving into solutions.</p>

<h3 id="2-user-tasks-what-people-are-actually-trying-to-do">2. User Tasks: What People Are Actually Trying to Do</h3>

<p>Beyond features or content, what are users actually trying to accomplish?</p>

<ul>
<li>Making an informed decision about a major purchase.</li>
<li>Finding the right form to apply for a service.</li>
<li>Understanding next steps in a complex process.</li>
<li>Checking eligibility for a program or benefit.</li>
</ul>

<p>These tasks should be based on user research and drive everything that follows. <a href="https://www.smashingmagazine.com/2022/05/top-tasks-focus-what-matters-must-defocus-what-doesnt/">Top task methodology</a> is a great approach to this.</p>

<h3 id="3-business-objectives-what-success-looks-like">3. Business Objectives: What Success Looks Like</h3>

<p>Every digital initiative should connect to clear organizational goals:</p>

<ul>
<li>Increasing online self-service adoption.</li>
<li>Reducing support costs.</li>
<li>Improving satisfaction and loyalty.</li>
<li>Meeting compliance requirements.</li>
<li>Generating leads or sales.</li>
</ul>

<p>These objectives provide the measurement framework for success. (If you work with OKRs, you can think of these as <strong>Key Results</strong> that connect to your overall <strong>Objective</strong>.)</p>

<h3 id="4-inward-paths-user-scenarios-and-approaches">4. Inward Paths: User Scenarios and Approaches</h3>

<p>This element goes beyond just findability to include the user’s entire approach and mental model:</p>

<ul>
<li>What scenarios lead them to this need?</li>
<li>What terminology do they use to describe their problem?</li>
<li>How would the phrase their need to Google or an LLM?</li>
<li>What emotions or urgency are they experiencing?</li>
<li>What channels or touchpoints do they use?</li>
<li>What existing knowledge do they bring?</li>
</ul>

<p>Understanding these angles of different approaches ensures we meet users where they are.</p>

<h3 id="5-forward-paths-guiding-the-journey">5. Forward Paths: Guiding the Journey</h3>

<p>What should users do after engaging with this core?</p>

<ul>
<li>Take a specific action to continue their task.</li>
<li>Explore related information or options.</li>
<li>Connect with appropriate support channels.</li>
<li>Save or share their progress.</li>
</ul>

<p>These paths create coherent journeys (core flows) rather than dead ends.</p>

<h3 id="6-core-content-the-essential-solution">6. Core Content: The Essential Solution</h3>

<p>Only after mapping the previous elements do we define the actual solution:</p>

<ul>
<li>What information must be included?</li>
<li>What functionality is essential?</li>
<li>What tone and language are appropriate?</li>
<li>What format best serves the need?</li>
</ul>

<p>This becomes our blueprint for what actually needs to be created.</p>

<h3 id="action-cards-from-insight-to-implementation">Action Cards: From Insight to Implementation</h3>

<p>The Core Model process culminates with action cards that answer the crucial seventh question: <em>“What needs to be done to create this solution?”</em></p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="419"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png"
			
			sizes="100vw"
			alt="Action card"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/core-model-start-from-answer-not-solution/2-action-card.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>These cards typically include:</p>

<ul>
<li>Specific actions required;</li>
<li>Who is responsible;</li>
<li>Timeline for completion;</li>
<li>Resources needed;</li>
<li>Dependencies and constraints.</li>
</ul>

<p>Action cards transform insights into concrete next steps, ensuring the workshop leads to real improvements rather than just interesting discussions.</p>

<h2 id="the-power-of-core-pairs">The Power of Core Pairs</h2>

<p>A unique aspect of the Core Model methodology is working in core pairs—two people from different competencies or departments working together on the same core sheet. This approach creates several benefits:</p>

<ul>
<li><strong>Cross-disciplinary insight</strong><br />
Pairing someone with deep subject knowledge with someone who brings a fresh perspective.</li>
<li><strong>Built-in quality control</strong><br />
Partners catch blind spots and challenge assumptions.</li>
<li><strong>Simplified communication</strong><br />
One-to-one dialogue is more effective than group discussions.</li>
<li><strong>Shared ownership</strong><br />
Both participants develop a commitment to the solution.</li>
<li><strong>Knowledge transfer</strong><br />
Skills and insights flow naturally between disciplines.</li>
</ul>

<p>The ideal pair combines different perspectives &mdash; content and design, business and technical, expert and novice &mdash; creating a balanced approach that neither could achieve alone.</p>

<h2 id="creating-alignment-within-and-between-teams">Creating Alignment Within and Between Teams</h2>

<p>The Core Model excels at creating two crucial types of alignment:</p>

<h3 id="within-cross-functional-teams">Within Cross-Functional Teams</h3>

<p>Modern teams bring together diverse competencies:</p>

<ul>
<li>Content creators focus on messages and narrative.</li>
<li>Designers think about user experience and interfaces.</li>
<li>Developers consider technical implementation.</li>
<li>Business stakeholders prioritize organizational needs.</li>
</ul>

<p>The Core Model gives these specialists a common framework. Instead of the designer focusing only on interfaces or the developer only on code, everyone aligns around user tasks and business goals.</p>

<p>As one UX designer told me:</p>

<blockquote>“The Core Model changed our team dynamic completely. Instead of handing off wireframes to developers who didn’t understand the ‘why’ behind design decisions, we now share a common understanding of what we’re trying to accomplish.”</blockquote>

<h3 id="between-teams-across-the-customer-journey">Between Teams Across the Customer Journey</h3>

<p>Users don’t experience your organization in silos &mdash; they move across touchpoints and teams. The Core Model helps connect these experiences:</p>

<ul>
<li>Marketing teams understand how their campaigns connect to service delivery.</li>
<li>Product teams see how their features fit into larger user journeys.</li>
<li>Support teams gain context on user pathways and common issues.</li>
<li>Content teams create information that supports the entire journey.</li>
</ul>

<p>By mapping connections between cores (core flows), organizations create coherent experiences rather than fragmented interactions.</p>

<h2 id="breaking-down-organizational-barriers">Breaking Down Organizational Barriers</h2>

<p>The Core Model creates a neutral framework where various perspectives can contribute while maintaining a unified direction. This is particularly valuable in traditional organizational structures where content responsibility is distributed across departments.</p>

<h2 id="the-workshop-making-it-happen">The Workshop: Making It Happen</h2>

<p>The Core Model workshop brings these elements together in a practical format that can be adapted to different contexts and needs.</p>

<h3 id="workshop-format-and-timing">Workshop Format and Timing</h3>

<p>For complex projects with multiple stakeholders across organizational silos, the ideal format is a full-day (6&ndash;hour) workshop:</p>

<p><strong>First Hour: Foundation and Context</strong></p>

<ul>
<li>Introduction to the methodology (15 min).</li>
<li>Sharing user insights and business context (15 min).</li>
<li>Reviewing pre-workshop hypotheses (15 min).</li>
<li>Initial discussion and questions (15 min).</li>
</ul>

<p><strong>Hours 2&ndash;4: Core Mapping</strong></p>

<ul>
<li>Core pairs work on mapping elements (120 min).</li>
<li>Sharing between core pairs and in plenary between elements.</li>
<li>Facilitators provide guidance as needed.</li>
</ul>

<p><strong>Hours 5&ndash;6: Presentation, Discussion, and Action Planning</strong></p>

<ul>
<li>Each core pair presents its findings (depending on the number of cores).</li>
<li>Extensive group discussion and refinement.</li>
<li>Creating action cards and next steps.</li>
</ul>

<p>The format is highly flexible:</p>

<ul>
<li>Teams experienced with the methodology can conduct focused sessions in as little as 30 minutes.</li>
<li>Smaller projects might need only 2&ndash;3 hours.</li>
<li>Remote teams might split the workshop into multiple shorter sessions.</li>
</ul>

<h3 id="workshop-environment">Workshop Environment</h3>

<p>The Core Model workshop thrives in different environments:</p>

<ul>
<li><strong>Analog</strong>: Traditional approach using paper <a href="https://drive.google.com/file/d/18yT6Fv-fFmVqorWuezRSAraVj2ngCwXh/view?usp=sharing">core sheets</a>.</li>
<li><strong>Digital</strong>: Virtual workshops using <a href="https://coremodel.link/miro">Miro</a>, <a href="https://coremodel.link/mural">Mural</a>, <a href="https://coremodel.link/figjam">FigJam</a>, or similar platforms.</li>
<li><strong>Hybrid</strong>: Digital canvas in physical workshop, combining in-person interaction with digital documentation.</li>
</ul>

<p><strong>Note</strong>: <em>You can find all downloads and templates <a href="http://coremodel.link/templates">here</a>.</em></p>

<h3 id="core-pairs-the-key-to-success">Core Pairs: The Key to Success</h3>

<p>The composition of core pairs is critical to success:</p>

<ul>
<li>One person should know the solution domain well (subject matter expert).</li>
<li>The other brings a fresh perspective (and learns about a different domain).</li>
<li>This combination ensures both depth of knowledge and fresh thinking.</li>
<li>Cross-functional pairing creates natural knowledge transfer and breaks down silos.</li>
</ul>

<h3 id="workshop-deliverables">Workshop Deliverables</h3>

<p><strong>Important to note</strong>: The workshop doesn’t produce final solutions.</p>

<p>Instead, it creates a comprehensive brief containing the following:</p>

<ul>
<li>Priorities and context for content development.</li>
<li>Direction and ideas for design and user experience.</li>
<li>Requirements and specifications for functionality.</li>
<li>Action plan for implementation with clear ownership.</li>
</ul>

<p>This brief becomes the foundation for subsequent development work, ensuring everyone builds toward the same goal while leaving room for specialist expertise during implementation.</p>

<h2 id="getting-started-your-first-core-model-implementation">Getting Started: Your First Core Model Implementation</h2>

<p>Ready to apply the Core Model in your organization? Here’s how to begin:</p>

<h3 id="1-form-your-initial-hypothesis">1. Form Your Initial Hypothesis</h3>

<p>Before bringing everyone together:</p>

<ul>
<li>Identify a core where users struggle and the business impact is clear.</li>
<li>Gather available user insights and business objectives.</li>
<li>Form a hypothesis about what this core should accomplish.</li>
<li>Identify key stakeholders across relevant departments.</li>
</ul>

<h3 id="2-bring-together-the-right-core-pairs">2. Bring Together the Right Core Pairs</h3>

<p>Select participants who represent different perspectives:</p>

<ul>
<li>Content creators paired with designers.</li>
<li>Business experts paired with technical specialists.</li>
<li>Subject matter experts paired with user advocates.</li>
<li>Veterans paired with fresh perspectives.</li>
</ul>

<h3 id="3-follow-the-seven-questions">3. Follow the Seven Questions</h3>

<p>Guide core pairs through the process:</p>

<ul>
<li>Who are we trying to help, and what’s their situation?</li>
<li>What are they trying to accomplish?</li>
<li>What do we want to achieve?</li>
<li>How do they approach this need?</li>
<li>Where should they go next?</li>
<li>What’s the essential content or functionality?</li>
<li>What needs to be done to create this solution?</li>
</ul>

<h3 id="4-create-an-action-plan">4. Create an Action Plan</h3>

<p>Transform insights into concrete actions:</p>

<ul>
<li>Document specific next steps on action cards.</li>
<li>Assign clear ownership for each action.</li>
<li>Establish timeline and milestones.</li>
<li>Define how you’ll measure success.</li>
</ul>

<h2 id="in-conclusion-common-sense-in-a-structured-framework">In Conclusion: Common Sense In A Structured Framework</h2>

<p>The Core Model works because it combines common sense with structure &mdash; asking the right questions in the right order to ensure we address what actually matters.</p>

<p>By starting FROM the answer, not WITH the solution, teams <strong>avoid premature problem-solving</strong> and create digital experiences that <strong>truly serve user needs</strong> while achieving organizational goals.</p>

<p>Whether you’re managing a traditional website, creating multi-channel content, or developing digital products, this methodology provides a framework for better collaboration, clearer priorities, and more effective outcomes.</p>

<p><em>This article is a short adaptation of my book</em> <strong><em>The Core Model &mdash; A Common Sense to Digital Strategy and Design</em></strong>. <em>You can find information about the book and updated resources at <a href="http://thecoremodel.com/">thecoremodel.com</a>.</em></p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Andy Budd</author><title>Improving The Double Diamond Design Process</title><link>https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/</link><pubDate>Fri, 25 Aug 2023 11:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/</guid><description>The so-called “Double Diamond” is a great way of visualizing an ideal design process, but it’s just not the way most companies deliver new projects or services. Andy Budd proposes a new “Double Diamond” idea that better aligns with the way work actually gets done and highlights the place where design has the most leverage. It’s no quick fix, but if you’ve found yourself constantly pushing against a locked door, this approach might help you find a door that’s been left slightly ajar &amp;mdash; and which you can actually open.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/" />
              <title>Improving The Double Diamond Design Process</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Improving The Double Diamond Design Process</h1>
                  
                    
                    <address>Andy Budd</address>
                  
                  <time datetime="2023-08-25T11:00:00&#43;00:00" class="op-published">2023-08-25T11:00:00+00:00</time>
                  <time datetime="2023-08-25T11:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>As a designer, you’re no doubt familiar with the <a href="https://blog.logrocket.com/ux-design/modern-double-diamond-design/">concept of the Double Diamond</a>, that super simple graphical representation of the ideal design process.</p>

<p>Typically you’ll see two squares rotated 45 degrees: the first square will say something like “discover” and “define,” while the second one will encourage you to “explore” and “create.” Each diamond will have a heading, such as “problem” and “solution,” or the more punchy “design the right thing” and “design the thing right.” Along the side of each diamond, there will be a label explaining how you must first diverge, i.e., come up with lots of options before you can converge into a single answer.</p>

<p>It’s one of the simplest articulations of the design process out there. It’s also why many designers hate their jobs. Let me explain…</p>

<p><strong>Note</strong>: <em>If you’re curious as to who and when nailed down the Double Diamond concept in its present modern form &mdash; which we see being referenced practically everywhere nowadays &mdash; check the <a href="#appendix-how-do-we-describe-the-design-process">Appendix</a> at the end of the article (“How do We Describe Design Process?”).</em></p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="451"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg"
			
			sizes="100vw"
			alt="An illustration that shows the process centered around the traditional ‘Designer Centric’ double diamond. It shows the basic design steps when designing a new product; the illustrations show the steps as they should happen in theory."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The traditional “Double Diamond” as viewed by designers. (<a href='https://files.smashing.media/articles/improving-double-diamond-design-process/traditional-double-diamond.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="designers-are-problem-finders-and-problem-solvers">Designers Are Problem-Finders And Problem-Solvers</h2>

<p>As designers, we like to think of ourselves as problem-finders as well as problem-solvers. Give us a user challenge, and we’ll use our research skills to uncover what’s <em>really</em> going on below the surface! We’ll take this information, reframe the problem, and come up with an even better solution &mdash; one that’s never been considered before. That’s what the double diamond is all about. It’s about avoiding the <em>obvious, shallow solutions</em> and instead freeing us up to be truly creative.</p>

<blockquote>“The formulation of a problem is often more essential than its solution, which may be merely a matter of mathematical or experimental skill. To raise new questions, new possibilities, to regard old problems from a new angle, requires creative imagination and marks real advance in science.”<br /><br />&mdash; Albert Einstein & Leopold Infeld (via: “<a href="https://www.infoq.com/articles/problem-reframing-method/">Using the Problem Reframing Method</a>”</blockquote>

<p>I think the best example of this can be found in the UK TV program <a href="https://en.wikipedia.org/wiki/Blue_Peter"><em>Blue Peter</em></a>, a British children’s television entertainment program created by John Hunter Blair, which is the longest-running children’s TV show in the world.</p>

<p>A few years back, Blue Peter got to interview <a href="https://en.wikipedia.org/wiki/Jony_Ive">design legend Jony Ive</a>. They explained to Jony how they’d set a challenge for their young viewers to design a lunchbox, pencil case, and school bag, all in one. He responded by saying that you needed to be <em>really careful</em> not to have the word “box” in the brief because it might determine the path you went down. You could imagine if Jony had set the challenge, he might have asked the kids to “design a means of storing and transporting your lunch to school.” A nice reframing of the problem which didn’t contain the proposed solution!</p>


<figure class="video-embed-container break-out">
  <div
  
  class="video-embed-container--wrapper">
		<lite-youtube
			videoid="FLUn7xCuQxo"
      
			
		></lite-youtube>
	</div>
	
</figure>

<p>I’ve been in countless meetings where stakeholders have effectively made the same “mistake” as the Blue Peter presenters when they defined what the outcome should be. And I have seen an equal number of annoyed designers, questioning the point of them even being there if they’re just going to be told what to design and how to design it. (And, of course, they rarely say this to the stakeholders’ faces. Instead, they simply moan about it behind their backs.)</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="exploring-the-context">Exploring The Context</h2>

<p>Designers understandably feel frustrated when asked to “design a lunchbox” because it immediately limits the potential outcome. This goes against what they’ve been taught design is all about and what design workflow models, such as the Double Diamond claim.</p>

<p>In an ideal world, designers would much prefer to spend time “bathing” in the problem space. This would include wanting to understand the variety of food items kids take to school with them and the level of protection they need. It would also involve following kids’ journeys over a couple of weeks to see how the products are used and talking to kids, to understand what they think is <em>cool</em>, and to their parents, to understand what’s <em>practical</em>. Of course, there’s a good chance that after all this, you might decide that a lunch box is <strong>exactly</strong> the sort of thing you should be designing! However, rather than this being only a hypothesis, you’ll now have confidence that you’re on the right path.</p>

<p>The architect Eliel Saarinen talks eloquently about the importance of designing a thing by considering it in its context:</p>

<blockquote>“Always design a thing by considering it in its next larger context &mdash; a chair in a room, a room in a house, a house in an environment, an environment in a city plan.”<br /><br />&mdash; <a href="https://noisydecentgraphics.typepad.com/design/2009/09/always-design-a-thing-by-considering-it-in-its-next-larger-context-a-chair-in-a-room-a-room-in-a-hou.html">Eliel Saarinen</a></blockquote>

<p>As such, it’s natural for designers to want to diverge, even if they end up converging on exactly the same thing. However, for our business partners, this sort of behavior can be very frustrating.</p>

<h2 id="what-if-you-actually-just-want-a-lunch-box">What If You Actually Just Want A Lunch Box?</h2>

<p>While designers like to believe they’ve been hired to “think outside the lunch box” (sorry for the pun), the truth of the matter is that most business stakeholders don’t see design this way.</p>

<p>Instead, when most business stakeholders are tasked with creating a way for kids to take food to school, they immediately think of “lunchbox.” They will then ask their industrial designers and graphic designers to come up with something interesting that parents and children will buy; ideally, something which can be made cost-effectively using their existing factories, equipment, and supply chain. Oh, and they need it ready for when the kids go back to school in three months’ time, as that’s peak lunchbox-buying season.</p>

<blockquote><strong>Question:</strong> How many UX Designers does it take to screw in a lightbulb?<br /><strong>Answer:</strong> First, we need to undertake a six months long project understanding the role of light in society!</blockquote>

<p>In this context, the organization has <em>already decided</em> that the lunchbox is a perfectly reasonable, logical, and obvious solution, so when the design team starts pushing back and asking for time to do <a href="https://webtorque.org/is-ux-research-about-de-risking-design/">additional research</a>, it sounds like a waste of time. Or worse, it might sound like the design team is actively trying to derail the project. As such, much as I hate to say this, sometimes you’ve just got to <em>grit your teeth and design the darn lunchbox</em>.</p>

<div class="partners__lead-place"></div>

<h2 id="how-design-actually-gets-done-outside-apple-and-airbnb">How Design Actually Gets Done (Outside Apple And Airbnb)</h2>

<p>While the double diamond concept is a wonderful model, it’s also largely a fantasy. Instead, most organizations will have a few meetings which generally won’t involve design (sorry). If you’re lucky, they might look at some external survey data or market data and come to the conclusion that we, too, need a lunchbox.</p>

<p>Getting anything done inside even a relatively small organization takes effort, as anybody who has ever been tasked to organize a team lunch or a short company retreat will know. As such, it usually requires a senior stakeholder to galvanize support. Because of this, “customer discovery” is often more about finding evidence to back up the assertion that this is the <em>right thing</em> to build rather than potentially discovering that it’s the <em>wrong thing</em> to build.</p>

<p>By the time the idea gets to design, the decision has usually been made, resources have usually already been allocated, a launch date may have been set (often arbitrarily and without really understanding how long designing the thing will actually take), and there’s little or no interest in doing anything which might slow this decision train down or derail it altogether. I call this process the <strong>reverse double diamond</strong>.</p>

<p>While this way of working may seem crazy to designers, in most organizations, this is <em>exactly</em> how things work, and fighting against that process is truly an uphill battle. However, there is an opportunity here if you want to grab it, which lies in the second half of the “reverse double diamond” concept.</p>

<h2 id="the-reverse-double-diamond-or-making-it-work-better">The Reverse Double Diamond (Or Making It Work Better)</h2>

<p>Now, let me start with this: I’m not claiming that the reverse double diamond is ideal. Far from it. However, it is a realistic model for how work actually gets done.</p>

<p>I also believe there is a way for design teams to slowly &mdash; and I really do mean <em>slowly</em> &mdash; pivot away from this and towards the traditional double diamond. But you’re not going to get there by adding a couple of slides about it to the design deck your boss asks you to present at the next leadership away day. Instead, it’s all about what you do post-launch.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="451"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg"
			
			sizes="100vw"
			alt="An illustration that shows the process centered around the ‘Reverse’ double diamond. It shows the basic design steps when designing a new product; the illustration shows the steps as they actually happen in practice."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The “Reverse Double Diamond” concept which is based on how most companies actually operate. (<a href='https://files.smashing.media/articles/improving-double-diamond-design-process/reverse-double-diamond.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>If you take a close look at the model above, you’ll see that the first part of the reverse double diamond is essentially accepting the status quo, letting your boss tell you to deliver the metaphorical equivalent of a “lunchbox feature,” and creating the best version possible with the time and information available. However, <em>the trick</em> to making the reverse double diamond work is to actively monitor how this new feature performs and &mdash; wait for it &mdash; <strong>make suggestions about how it can be improved post-launch</strong>.</p>

<p>Once the lunchbox feature has been delivered and is out in the wild, the stakeholder who sponsored it no longer needs to be protective of it. The problem switches from being a delivery problem (“Can we actually get this thing launched?”) to being a <strong>value extraction problem</strong> (“How can we make this existing thing work better?”). This is the exact point in time where you put your business hat on, look at the stats, and say something like this, “This feature currently has relatively low utilization of only 5%. However, we believe that with some tweaks, we can get this up to 20%.”</p>

<p>In ye olde days, this used to be called “making a business case,” and it’s frankly much easier to make a business case for something that <strong>already exists</strong> and you believe can be made better than it is doing research on something that <strong>doesn’t yet</strong> exist and might be just fine as it is.</p>

<p>In essence, you’re still doing research work, and you’re still going to be exploring a <em>range of potential solutions</em> &mdash; you’re just doing this once the feature is already out in the market and you know exactly how it’s performing. Of course, this all depends on a number of things, including how well or poorly the feature performs, how good your design and product leaders are at making a business case, and how much work the design team has on. Unless you’re able to make a solid release plan, it’s likely that the second half of the reverse double diamond will actually be uncoupled from the first.</p>

<p>For companies that have featured teams and growth teams, it’s even possible that your feature teams will deliver the first half of the reverse double diamond before handing it over to the growth team to do the second half. As a result, this process is less than ideal. However, it’s much more pragmatic and goes fine “with the grain” of most organizations.</p>

<h2 id="iterating-towards-the-traditional-double-diamond">Iterating Towards The Traditional Double Diamond</h2>

<p>Earlier, I hinted that this process might, over time, allow you to get to the “design nirvana” represented by the traditional double diamond. The logic here is that by constantly improving products post-launch, the organization learns to trust the design team’s ability and, more importantly, their vision.</p>

<p>As you garner more trust and evidence, over time, you can start making the case that it would be quicker and more cost-effective if you spent a few weeks upfront trying to avoid the mistakes, which can often take months or even years to address. Mistakes that will also often result in some lost revenue. In fact, this is effectively the same argument many designers make for adopting the traditional double diamond workflow in the first place &mdash; you’re just doing so by using evidence rather than belief and theory.</p>

<div class="partners__lead-place"></div>

<h2 id="conclusion">Conclusion</h2>

<p>The Double Diamond concept is great, but it’s just not the way most organizations function. If, as a designer, you set your expectations around this theoretical model, you’re going to be continually disappointed! However, designers are meant to be great at understanding how things <em>actually work</em> rather than how we <em>think</em> they should work.</p>

<p>If we want to initiate change, we need to ask for more accurate models of how design actually works inside our organizations and <strong>target the areas where we have the most leverage</strong>. I believe this means adopting some variant of the “reverse double diamond” idea, accepting that we’re going to be told to deliver “lunch box features” 90% of the time, and <strong>shifting our attention away from pre-launch solutions to post-launch solutions</strong>.</p>

<p>We can design and then release a good first version of a product out into the world as quickly as possible and then use our business and communication skills to petition for and make measurable improvements to it. And if we can do this consistently, there’s a slim &mdash; but tangible! &mdash; chance that we can switch the “double diamond” back around.</p>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li>“<a href="https://www.smashingmagazine.com/2019/07/mvp-app-development/">Should You Create An MVP Before Creating An App?</a>,” by Suzanne Scacca <em>(Smashing Magazine)</em><br />
Apps are neither small undertaking nor cheap to build and maintain. So, before you move ahead with creating a new mobile app or SaaS for your client, perhaps you should consider launching a minimum viable product (MVP) instead. With an MVP, you have a low-risk and lower-cost way of testing your concept on the market. What’s not to love about that?</li>
<li>“<a href="https://www.smashingmagazine.com/2015/12/getting-back-into-right-deliverables-business/">Getting Back Into The (Right) Deliverables Business</a>,” by Rian van der Merwe <em>(Smashing Magazine)</em><br />
“Get out of the deliverables business” has become quite a mantra in the lean startup and UX movements. There’s much to love in that sentiment. After all, for every wireframe you make, you’re not shipping code to customers. But just like with the concept of a minimum viable product (MVP), it’s likely that we’ve taken this sound advice to an extreme which actually is hurtful to the creation of good products. What follows is the author’s account of navigating these stormy design seas together with the community.</li>
<li>“<a href="https://www.eleken.co/blog-posts/design-thinking-minimum-viable-product">Design Thinking &amp; Minimum Viable Product: Is This the Right Approach?</a>,” by Masha Panchenko <em>(Eleken Blog)</em><br />
Design thinking has become a highly popular approach during the last forty years. It is used in IT, business, education, design &mdash; literally everywhere. There is even a book about applying design thinking for personal use called <em>Designing Your Life</em>. We don’t know if design thinking will help to change your life for the better, but what we know is that design thinking is a great approach when it comes to building a Minimum Viable Product.</li>
<li><a href="https://designingyour.life/the-book/"><em>Designing Your Life</em></a>, a book by Bill Burnett &amp; Dave Evans<br />
A book that shows you how to build &mdash; to design &mdash; a life you can thrive in at any age or stage. Designers create worlds and solve problems using design thinking. Everything in our lives was designed by someone, and every design starts with a problem that a designer or team of designers seeks to solve. In this book, the authors show us how design thinking can help us create a life that is both meaningful and fulfilling, regardless of who or where we are, what we do or have done for a living, or how young or old we are.<br />
<em>(Editor’s Note: This book was, in fact, also recommended to me by <a href="https://www.smashingmagazine.com/author/joshua-mauldin/">Joshua Mauldin</a> a while ago, and I cannot but highly recommend it to everyone! It’s a fantastic, very useful read. &mdash; M.B.)</em></li>
<li>“<a href="https://www.infoq.com/articles/problem-reframing-method/">Using the Problem Reframing Method</a>,” by Sebastian Straube <em>(product management &amp; discovery coach at Accenture Business Agility)</em><br />
Avoid jumping directly into solution thinking and not empathizing with the problem itself; looking at a problem from different angles helps to build more innovative, sustainable solutions, and you need to try different reframing practices and methods as there is not a one-size-fits-all approach.</li>
<li>“<a href="https://webtorque.org/is-ux-research-about-de-risking-design/">Is UX Research About ‘De-risking’ Design?</a>,” by Jonathan Baker-Bates <em>(UX architect at LBi, VP of UX at TES Global)</em><br />
Is UX research centered on helping designers predict eventual outcomes of design interventions, or is its role to “de-risk” UX and business ideas? Research is often framed as a way of lowering the risk to the business (this applies both to design validation as well as to exploratory research), but research should be checking whether what we said about a given intervention actually tends to happen.</li>
<li>“<a href="https://blog.logrocket.com/ux-design/modern-double-diamond-design/">Modern Double Diamond design: Rethinking a classic design process</a>,” by Victory Brown<br />
To accomplish your tasks, you’ll need to set up a process that will allow you to complete them quickly and also give the best results. Sometimes the design process can be a jungle of trends and patterns; it involves a lot of back and forth to produce the best design solutions. No design is the final design, and every procedure can be iterated on. This is why the Design Council came together in 2005 to develop a new approach to designing solutions with creative thinking, systems design, and design management in mind: the Double Diamond design process.</li>
<li>“<a href="https://www.designcouncil.org.uk/our-resources/the-double-diamond/history-of-the-double-diamond/">History of the Double Diamond</a>”<br />
This article describes the history behind the Double Diamond concept, created by the Design Council (established in 1944 by Winston Churchill’s wartime government). Over the course of several sessions, the group came up with a simplified way to describe any design and innovation process. It is based on four distinct phases that the design team, deliberately seeking a memorable device, named <strong>Discover</strong>, <strong>Define</strong>, <strong>Develop</strong>, and <strong>Deliver</strong>.</li>
</ul>

<h3 id="appendix-how-do-we-describe-the-design-process">Appendix: “How Do We Describe The Design Process?”</h3>

<p>A short bit of history. In 2003, the <a href="https://www.designcouncil.org.uk/our-resources/the-double-diamond/">Design Council</a> promoted the positive impact of adopting a strategic approach to design and the value of “design management” as a practice. However, they had no standard way of describing the supporting process. Richard Eisermann, Design Council’s then Director of Design and Innovation, thought this was incompatible with their broader message, so he asked his team, “How do we describe the design process?”</p>

<blockquote>“The team put in the work trying to define design, process, methods, etc. What we did with the Double Diamond was codify it, rename the steps, and popularize it. It was important work, but we were certainly standing on the shoulders of giants.”<br /><br />&mdash; Richard Eisermann</blockquote>

<p>Of course, kite-shaped (diamond-shaped) process models have been referenced as far back as the 1960s, but models of the design process were not widely shared at this point. Part of the Design Council’s reason for creating the Double Diamond concept was to address this lack of visibility. Today the Double Diamond is considered a universally accessible description of the design process, has become an accepted part of design language, and is used and referenced worldwide.</p>

<p>→ <a href="https://www.designcouncil.org.uk/our-resources/the-double-diamond/">History of the Double Diamond</a>, <a href="https://www.designcouncil.org.uk/who-we-are/our-history/">The Design Council</a></p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(mb, yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Vitaly Friedman</author><title>What’s The Perfect Design Process?</title><link>https://www.smashingmagazine.com/2023/06/perfect-design-process/</link><pubDate>Thu, 29 Jun 2023 10:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/06/perfect-design-process/</guid><description>The design process is messy. You might be following a structured approach, but too often, it takes a life of its own. And before you know it, you are designing in chaos, with last-minute changes and missed deadlines. So, what’s the “perfect” design process?</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/06/perfect-design-process/" />
              <title>What’s The Perfect Design Process?</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>What’s The Perfect Design Process?</h1>
                  
                    
                    <address>Vitaly Friedman</address>
                  
                  <time datetime="2023-06-29T10:00:00&#43;00:00" class="op-published">2023-06-29T10:00:00+00:00</time>
                  <time datetime="2023-06-29T10:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p><strong>Design process is messy.</strong> You might be following a structured approach, but with all the last-minute changes and overlooked details, too often, it takes a life of its own. And before you know it, you are designing in a chaotic environment full of refinements, final-final deliverables, and missed deadlines.</p>

<style>.course-intro{--shadow-color:206deg 31% 60%;background-color:#eaf6ff;border:1px solid #ecf4ff;box-shadow:0 .5px .6px hsl(var(--shadow-color) / .36),0 1.7px 1.9px -.8px hsl(var(--shadow-color) / .36),0 4.2px 4.7px -1.7px hsl(var(--shadow-color) / .36),.1px 10.3px 11.6px -2.5px hsl(var(--shadow-color) / .36);border-radius:11px;padding:1.35rem 1.65rem}@media (prefers-color-scheme:dark){.course-intro{--shadow-color:199deg 63% 6%;border-color:var(--block-separator-color,#244654);background-color:var(--accent-box-color,#19313c)}}</style>
  

<p class="course-intro">This article is <strong>part of our ongoing series</strong> on <a href="/category/design-patterns">design patterns</a>. It’s an upcoming part of the video library on <a style="font-weight:700" href="https://smart-interface-design-patterns.com/">Smart Interface Design Patterns</a>&nbsp;🍣 and is a part of the <a href="https://smashingconf.com/online-workshops/workshops/interface-design-course-vitaly-friedman/">live UX training</a> as well.</p>

<h2 id="what-s-the-right-design-process">What’s The “Right” Design Process?</h2>

<p>Of course, there is no “right-and-only” way to frame a design process. It’s defined by whatever works well for you and for your team. Personally, I tend to rely on <strong>4 design models</strong> that seem to fit well with my design work:</p>

<ul>
<li><a href="https://medium.com/digital-experience-design/how-to-apply-a-design-thinking-hcd-ux-or-any-creative-process-from-scratch-b8786efbf812">Double Diamond Process</a> for its comprehensive and reliable methodology for solving problems. In this guide, Dan Nessler breaks down the entire Double-Diamond process into single parts, explaining how exactly it works, step-by-step, in all fine details.</li>
</ul>














<figure class="
  
  
  ">
  
    <a href="https://medium.com/digital-experience-design/how-to-apply-a-design-thinking-hcd-ux-or-any-creative-process-from-scratch-b8786efbf812">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="450"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png"
			
			sizes="100vw"
			alt="How to apply a design thinking, HCD, UX or any creative process from scratch"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The classic. The <a href='https://medium.com/digital-experience-design/how-to-apply-a-design-thinking-hcd-ux-or-any-creative-process-from-scratch-b8786efbf812'>Double-Diamond process revamped</a> for messy reality. A helpful guide by Dan Nessler. (<a href='https://files.smashing.media/articles/perfect-design-process/01-double-diamond-process.png'>Large preview</a>)
    </figcaption>
  
</figure>

<ul>
<li><a href="https://uxdesign.cc/why-the-double-diamond-isnt-enough-adaa48a8aec1">Triple Diamond Process</a> for its more realistic approach to the designer’s input across the product’s life cycle. That’s a piece by <a href="https://www.linkedin.com/in/ACoAABoRt6sBLfH-Jr9p1e5aBm_DKhkGCascETw">Adam Gray</a> on why bringing flexibility to the messy reality of the design process is critical to improving planning and involving design work as prototypes are being built.</li>
</ul>














<figure class="
  
  
  ">
  
    <a href="https://uxdesign.cc/why-the-double-diamond-isnt-enough-adaa48a8aec1">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="450"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png"
			
			sizes="100vw"
			alt="Why the double diamond isn’t enough"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Extending Double Diamond with an extra Diamond to bring more focus into experimentation and refinement. From <a href='https://uxdesign.cc/why-the-double-diamond-isnt-enough-adaa48a8aec1'>Triple Diamond Process</a>, a guide by Adam Gray. (<a href='https://files.smashing.media/articles/perfect-design-process/02-triple-diamond-process.png'>Large preview</a>)
    </figcaption>
  
</figure>

<ul>
<li><a href="https://www.ibm.com/design/thinking/page/framework">Enterprise Design Thinking Model by IBM</a> for its focus on design maturity and scale, which really helps large organizations. A useful model that helps argue for user research, user-centricity, and rapid low-fidelity prototyping &mdash; and how to transfer ownership to design teams at scale.</li>
</ul>














<figure class="
  
  
  ">
  
    <a href="https://www.ibm.com/design/thinking/page/framework">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="642"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png"
			
			sizes="100vw"
			alt="The Framework Design thinking re-envisioned for the modern enterprise"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A helpful model for complex projects and enterprise world: <a href='https://www.ibm.com/design/thinking/page/framework'>Enterprise Design Thinking Model by IBM</a>. (<a href='https://files.smashing.media/articles/perfect-design-process/03-IBM-design-thinking-process.png'>Large preview</a>)
    </figcaption>
  
</figure>

<ul>
<li><a href="https://danmall.com/posts/hot-potato-process/">Hot Potato process</a>, for its simplicity in bridging design and development across the <strong>entire product lifecycle</strong>. Designers and developers throw ideas, mock-ups, and prototypes to each other permanently. Sometimes there are more involved design phases than dev phases, but <a href="https://smart-interface-design-patterns.com/articles/design-handoff/">there is no hand-off</a>, and the entire process is driven by <strong>continuous collaboration</strong>.</li>
</ul>














<figure class="
  
  
  ">
  
    <a href="https://danmall.com/posts/hot-potato-process/">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="403"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png"
			
			sizes="100vw"
			alt="The Hot Potato Process"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A collaborative approach for designers and developers, focused on throwing ideas back and forth: the <a href='https://danmall.com/posts/hot-potato-process/'>Hot Potato process</a> by Dan Mall. (<a href='https://files.smashing.media/articles/perfect-design-process/04-hot-potato-process.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>These ways of thinking about the design process translated into a process that works well for me but has to be adjusted for every project that I’m working on. In a nutshell, here’s how it would work.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Roll up your sleeves and <strong>boost your UX skills</strong>! Meet <strong><a data-instant href="https://smart-interface-design-patterns.com/">Smart Interface Design Patterns</a></strong>&nbsp;🍣, a 10h video library by Vitaly Friedman. <strong>100s of real-life examples</strong> and live UX training. <a href="https://www.youtube.com/watch?v=3mwZztmGgbE">Free preview</a>.</p>
<a data-instant href="https://smart-interface-design-patterns.com/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://smart-interface-design-patterns.com/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3155f571-450d-42f9-81b4-494aa9b52841/video-course-smart-interface-design-patterns-vitaly-friedman.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8c98e7f9-8e62-4c43-b833-fc6bf9fea0a9/video-course-smart-interface-design-patterns-vitaly-friedman.jpg"
    alt="Feature Panel"
    width="690"
    height="790"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="a-process-that-works-for-me">A Process That Works For Me</h2>

<p>There is no such thing as enough user research. In every project, I start with <strong>involving users as early as possible</strong>. I explore all the data we have, interview customer support and the service desk, check for technical debt and design issues, backlog items, and dismissed ideas. I explore organizational charts to understand layers of management. I set the right expectations and seek allies.</p>

<p>From there, I would typically spend weeks or even months in diagrams and spreadsheets and endless docs before drawing a single pixel on the screen. I try to get developers on board, so they can start setting up the dev environment already.</p>

<p>I bring in stakeholders and people who have a vested interest in <strong>contributing to the success of the project</strong>. Voices that need to be heard but are often forgotten. I see my role as a person who needs to bridge the gap between business requirements and user needs through the lens of design.</p>

<p><strong>Then I take a blank piece of paper and start sketching</strong>. I sketch ideas. I sketch customer journey maps. I sketch content boxes. I write down components that we will surely need in the product &mdash; the usual suspects. I set up a workshop with designers and developers to decide on names. Then developers can go ahead and prototype while designers focus on UI and interaction design.</p>

<p>To make sure I get both sides of the equation right, I draft customer journey maps, brainstorm ideas and <a href="https://roadmunk.com/product-prioritization-ebook/">prioritize them</a> with the <a href="https://foldingburritos.com/blog/kano-model/#end-form">Kano model</a> and <a href="https://miro.com/templates/impact-effort-matrix/">Impact ÷ Effort matrix</a> (with developers, PMs, and stakeholders).</p>














<figure class="
  
  
  ">
  
    <a href="https://whimsical.com/finviz-kpis-CTzucrgZkLUefK6Mekd38c">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="404"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png"
			
			sizes="100vw"
			alt="An example of a Design KPI tree"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      An <a href='https://whimsical.com/finviz-kpis-CTzucrgZkLUefK6Mekd38c'>example of a Design KPI tree</a>, connecting business goals with design objectives. (<a href='https://files.smashing.media/articles/perfect-design-process/05-design-KPI-tree.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>I don’t want to waste time designing and building the wrong thing, so I establish <a href="https://www.linkedin.com/pulse/design-kpis-ux-metrics-vitaly-friedman/">design KPIs</a> and connect them with business goals using <a href="https://whimsical.com/kpi-tree-2heCEgnYprowt9gUwMKfZ1">KPI trees</a>. I get a sign-off on those, and then the interface design starts.</p>

<p>I develop hypotheses. Low-fidelity mock-ups. Speak to developers. Get their feedback. Refine. Throw the mock-ups to developers. Bring them into HTML and CSS. Test hypotheses in usability sessions until we get to an 80% success rate for top tasks. Designers keep refining, and developers keep building out.</p>

<p><strong>Establish a process to continuously measure the quality of design</strong>. Track task completion rates. Track task completion times. Track error rates. Track error recovery rates. Track accessibility. Track sustainability. Track performance. In a B2B setting, we track the time customers need to complete their tasks and try to minimize it.</p>

<p><strong>Make them visible to the entire organization</strong> to show the value of design and its impact on business KPIs. Explain that the process isn’t based on hunches. It’s an evidence-driven design.</p>

<p><strong>Establish ownership and governance</strong>. The search team must be measured by the quality of search results for the top 100 search queries over the last two months. People who publish content are owners of that content. It’s their responsibility to keep it up-to-date, rewrite, archive, or delete it.</p>

<p>Refine, refine, refine. Keep throwing new components and user journeys to developers. Stop. Test with users to check how we are doing. Keep going and refine in the browser. Continuously and rigorously test. Launch and keep refining. <strong>Measure the KPIs</strong> and report to the next iteration of the design.</p>

<p>Admittedly, it is a bit messy. But it helps me stay on track when <strong>navigating a complex problem space</strong> in a way that delivers measurable results, removes bias and subjectivity from design decisions, and helps deliver user-centric designs that also address business needs.</p>

<div class="partners__lead-place"></div>

<h2 id="wrapping-up">Wrapping Up</h2>

<p>Of course, there is no “right-and-only” way to frame a design process. It’s defined by whatever works well for you and for your team. Explore options and keep them in mind when designing your design process. Whatever you choose, don’t follow it rigidly just for the sake of it, and combine bits from all models to make it right for you.</p>

<p>As long as it works well for you, it’s right. And that’s the only thing that matters.</p>

<p>You can find more details on <strong>design patterns</strong> in the <a href="https://smart-interface-design-patterns.com">video library on Smart Interface Design Patterns 🍣</a> &mdash; with a <a href="https://smart-interface-design-patterns.com">live UX training</a> that’s coming up in September this year.</p>

<h3 id="further-reading-on-smashing-magazine">Further Reading on Smashing Magazine</h3>

<ul>
<li>“<a href="https://www.smashingmagazine.com/2021/04/content-fundamental-part-web-design-process/">Why Content Is Such A Fundamental Part Of The Web Design Process</a>,” Matt Saunders</li>
<li>“<a href="https://www.smashingmagazine.com/2020/02/seo-web-design-process/">Where Does SEO Belong In Your Web Design Process?</a>,” Suzanne Scacca</li>
<li>“<a href="https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/">The Impact Of Agile Methodologies On Code Quality</a>,” Sarah Oke Okolo</li>
<li>“<a href="https://www.smashingmagazine.com/2023/03/pragmatists-guide-lean-user-research/">A Pragmatist’s Guide To Lean User Research</a>,” Paul Boag</li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Sarah Oke Okolo</author><title>The Impact Of Agile Methodologies On Code Quality</title><link>https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/</link><pubDate>Thu, 25 May 2023 11:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/</guid><description>Say goodbye to traditional workflows and embrace Agile to unlock the power of high-quality code. Discover how Agile methodologies promote simplicity, modularization, readability, and continuous improvement, resulting in faster turnaround times, more responsive development processes, and ultimately, the creation of high-quality software that meets customer needs.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/" />
              <title>The Impact Of Agile Methodologies On Code Quality</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>The Impact Of Agile Methodologies On Code Quality</h1>
                  
                    
                    <address>Sarah Oke Okolo</address>
                  
                  <time datetime="2023-05-25T11:00:00&#43;00:00" class="op-published">2023-05-25T11:00:00+00:00</time>
                  <time datetime="2023-05-25T11:00:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>As software development continues to evolve, so too do the methodologies and approaches used to create it. In recent years, Agile methodologies have gained widespread adoption as a modern approach to software development, with a focus on flexibility, collaboration, and <em>delivering working software in short increments</em>. This is a key differentiator when it comes to other development workflows.</p>

<p>One of the key benefits of Agile methodologies is its impact on the quality of the code that ships. Code quality is an essential aspect of software development, as high-quality code is critical to ensure the reliability, maintainability, and scalability of any software, website, or application.</p>

<h2 id="overview-of-agile-methodologies">Overview Of Agile Methodologies</h2>

<p>Agile methodologies are a set of software development approaches that prioritize flexibility, collaboration, and delivering working software in short increments. Agile methodologies aim to improve the quality of the software by allowing for frequent feedback, continuous improvement, and adaptation to changing requirements.</p>

<p>The <a href="https://agilemanifesto.org/">Agile Manifesto</a>, created in 2001 by a group of software developers who wanted to find a better way of developing software, outlines the core values and principles of Agile methodologies. These values include prioritizing individuals and interactions over processes and tools, working software over comprehensive documentation, customer collaboration over contract negotiation, and responding to change rather than following a concrete, long-term plan.</p>

<p>Agile methods break down projects into small and manageable units called <a href="https://www.atlassian.com/agile/scrum/sprints"><strong>sprints</strong></a>. Sprints are completed by cross-functional and self-organizing teams in a short period of time, usually two to four weeks. During each sprint, the team works on a specific set of tasks, and at the end of the sprint, they review their work, evaluate customer satisfaction, and identify areas for improvement. Because each sprint is focused on a specific set of tasks, the team can quickly pivot and adjust their approach if they receive new information or feedback from customers or stakeholders. This results in <strong>faster turnaround times and a more responsive development process</strong> which is essential for creating high-quality software that meets the needs of the end users.</p>

<p>There are several Agile methodologies that teams can choose from to develop software in a more flexible and iterative way.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="309"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png"
			
			sizes="100vw"
			alt="A list with Agile methodologies"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/impact-agile-methodologies-code-quality/methodologies.png'>Large preview</a>)
    </figcaption>
  
</figure>

<ul>
<li><strong>Scrum:</strong> This is perhaps the most popular Agile methodology. It involves a small team of developers working together in short sprints to deliver a working product incrementally. Each sprint typically lasts for 2&ndash;4 weeks.</li>
<li><strong>Kanban:</strong> This methodology focuses on continuous delivery and improving workflow efficiency. Work is broken down into smaller pieces and tracked on a visual board, and team members pull work items as they are ready to work on them. If you’ve used a <a href="https://trello.com">Trello</a> board before, then you know exactly how this works. Other apps, like <a href="https://www.notion.so">Notion</a>, offer similar features.</li>
<li><strong>Extreme Programming (XP):</strong> XP is a methodology that emphasizes software quality and customer satisfaction. It involves practices such as pair programming, test-driven development, and continuous integration.</li>
<li><strong>Lean Development:</strong> This methodology aims to reduce waste and increase efficiency in the development process. It involves continuous improvement and a focus on delivering value to the customer.</li>
<li><strong>Crystal:</strong> This methodology is designed for small teams working on projects with a high degree of uncertainty. It involves frequent communication, regular feedback loops, and an emphasis on collaboration.

<br /></li>
</ul>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Roll up your sleeves and <strong>boost your UX skills</strong>! Meet <strong><a data-instant href="https://smart-interface-design-patterns.com/">Smart Interface Design Patterns</a></strong>&nbsp;🍣, a 10h video library by Vitaly Friedman. <strong>100s of real-life examples</strong> and live UX training. <a href="https://www.youtube.com/watch?v=3mwZztmGgbE">Free preview</a>.</p>
<a data-instant href="https://smart-interface-design-patterns.com/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://smart-interface-design-patterns.com/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3155f571-450d-42f9-81b4-494aa9b52841/video-course-smart-interface-design-patterns-vitaly-friedman.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8c98e7f9-8e62-4c43-b833-fc6bf9fea0a9/video-course-smart-interface-design-patterns-vitaly-friedman.jpg"
    alt="Feature Panel"
    width="690"
    height="790"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="how-agile-methodologies-can-impact-code-quality">How Agile Methodologies Can Impact Code Quality</h2>

<p>Code quality is one of the most essential aspects of any development process, as it directly impacts the success of any product. Agile methodologies have been designed to prioritize a customer-centric approach by breaking down features into smaller, manageable pieces of functionality. This allows for more frequent releases of working quality code that can be tested and reviewed to help deliver high-quality software that meets customer needs. Here are some practical ways in which Agile methodologies help promote and impact efficient code quality in development:</p>

<ul>
<li><strong>Prioritizing simplicity and efficiency.</strong><br />
Agile methodologies prioritize simplicity and efficiency in software development. This means that developers are encouraged to write code that is not only functional but also easy to understand, test, debug, maintain, and modify. The goal is to create a codebase that is clean and simple, which can help reduce the potential for bugs and errors.</li>
<li><strong>Encouraging modularization.</strong><br />
The Agile process promotes the modularization of code. By breaking code down into smaller, modular components, developers can create code that is more flexible and reusable. This can save time and effort in the long run by reducing the need for repetitive or verbose code. Additionally, by optimizing the performance of each component, the developer is able to reduce the overall processing time, resulting in a more efficient codebase, breaking down features into smaller, more manageable pieces &mdash; often referred to as <a href="https://www.agilealliance.org/glossary/user-stories/">user stories</a> or <a href="https://www.atlassian.com/agile/project-management/epics#:~:text=What%20is%20an%20agile%20epic,over%20a%20set%20of%20sprints.">epics</a>. This approach allows development teams to focus on delivering small, working pieces of functionality that can be tested and validated before being integrated into the larger codebase while also enabling them to respond quickly to changing requirements or feedback.</li>
<li><strong>Improving readability.</strong><br />
It’s important that code is legible and understood across the team, as it affects not only the developer who wrote the code but also other developers who may need to modify or maintain the code in the future. Agile methodologies help developers focus on writing code that is self-documenting and easy to understand by promoting the use of clear and concise coding practices such as self-descriptive naming conventions and avoiding complex code structures.</li>
<li><strong>Test-Driven Development (TDD).</strong><br />
TDD involves writing tests for the code before writing the code itself, which can help ensure that the code is well-structured and easy to read. This method emphasizes continuous feedback and improvement on the code, as developers are regularly provided with feedback on their work and have opportunities to make improvements as they go. By receiving feedback early on in the development process, developers can address issues and make changes to their code before they become bigger problems.</li>
<li><strong>Continuous integration.</strong><br />
This is a development practice that involves frequently integrating code changes from multiple developers into a single shared codebase. With continuous integration, code is automatically compiled, tested, and validated, which helps to catch issues early on in the development process. This approach ensures that code is always in a releasable state, which ultimately helps to improve code quality and reduce the risk of bugs or errors.</li>
</ul>

<p>Overall, Agile methodologies can help developers write better code by <strong>promoting continuous code feedback and improvement while prioritizing simplicity and efficiency</strong>. By following these principles, developers can create code that is more efficient, maintainable, and robust, ultimately resulting in a better end product.</p>

<h2 id="key-principles-of-agile-development">Key Principles Of Agile Development</h2>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="576"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png"
			
			sizes="100vw"
			alt="A graph of the Agile process"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-principles.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>At its core,</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aAgile%20methodologies%20value%20individuals%20and%20their%20interactions%20over%20following%20strict%20processes%20and%20tools.%0a&url=https://smashingmagazine.com%2f2023%2f05%2fimpact-agile-methodologies-code-quality%2f">
      
Agile methodologies value individuals and their interactions over following strict processes and tools.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>This means that communication and collaboration between team members are prioritized to ensure everyone is working towards the same goals.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="403"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png"
			
			sizes="100vw"
			alt="Agile goals"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/impact-agile-methodologies-code-quality/agile-goals.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>These processes are governed by a set of guiding principles that help the development team to create software that is tailored to the customer’s needs while ensuring high-quality delivery.</p>

<ul>
<li><strong>Customer satisfaction is the top priority.</strong><br />
The goal of Agile development is to create software that meets the needs of the customer. This means that the customer is involved in every step of the process, from planning to testing.</li>
<li><strong>Teamwork is essential.</strong><br />
Cross-functional teams that work together to complete tasks are a core principle. This means that everyone on the team has a role to play, and everyone works together to achieve the same goal.</li>
<li><strong>Flexibility is key.</strong><br />
Everything about Agile development is designed to be flexible and adaptable. This means that the team can change course if needed, and the development process can be adjusted based on feedback from the customer.</li>
<li><strong>Communication is critical.</strong><br />
Open and honest communication between team members and the customer is encouraged. Everyone should feel empowered to share their ideas, concerns, and feedback.</li>
<li><strong>Iterative development.</strong><br />
Agile development involves breaking the development process down into smaller, more manageable pieces. By working on one sprint at a time, the team can make progress quickly and efficiently.</li>
<li><strong>Continuous improvement.</strong><br />
This means that the team is always looking for ways to improve the development process and make it more effective.</li>
</ul>

<div class="partners__lead-place"></div>

<h2 id="prioritizing-collaboration-and-communication">Prioritizing Collaboration And Communication</h2>

<p>Effective collaboration and communication are crucial in any team-oriented project, and Agile methodologies place a particular emphasis on these values.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aPrioritizing%20collaboration%20and%20communication%20ensures%20that%20everyone%20involved%20in%20the%20project%20is%20working%20towards%20the%20same%20goals%20and%20that%20any%20issues%20or%20concerns%20can%20be%20addressed%20quickly%20and%20effectively.%0a&url=https://smashingmagazine.com%2f2023%2f05%2fimpact-agile-methodologies-code-quality%2f">
      
Prioritizing collaboration and communication ensures that everyone involved in the project is working towards the same goals and that any issues or concerns can be addressed quickly and effectively.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>When collaboration and communication are prioritized, team members are encouraged to share their expertise and insights, which can lead to more creative and innovative solutions.</p>

<p>In an Agile environment, team members work closely together, and there is often a high level of interdependence between different areas of the project. If one team member is struggling or working in isolation, it can have a ripple effect on the rest of the team and ultimately impact the success of the project. Collaborating with other developers can help identify issues in the code that may not have been noticed otherwise. For example, another developer may notice a potential security vulnerability or identify a bug the original developer missed. Here are some of the key ways to ensure this:</p>

<ul>
<li><strong>Encourage cross-functional teams.</strong><br />
Bringing together individuals with different skills and expertise can lead to stronger communication between business owners and the technical team that produces the product. I remember a time when I was working on a project with my team, and we divided the work based on each person’s strengths. This approach allowed everyone to contribute their best work to the project.</li>
<li><strong>Break down silos.</strong><br />
Silos refer to a situation where different teams or departments within an organization work in isolation from each other, without much communication or collaboration. Silos can lead to several negative outcomes, such as a lack of transparency, duplication of effort, and a slower development process. Eliminating barriers between individuals and teams would help foster collaboration by allowing individuals to share their skills and expertise.</li>
<li><strong>Hold regular check-ins and feedback sessions.</strong><br />
Scheduling consistent check-ins and feedback sessions can help ensure everyone is aligned on priorities and goals. I’ve found that this approach helps keep everyone motivated and focused on the end goal.</li>
<li><strong>Use proper communication channels.</strong><br />
Utilizing appropriate communication channels can increase the transparency and visibility of the project. In my experience, using tools like instant messaging (like Slack) and video conferencing (like Zoom) has helped facilitate collaboration and information sharing, particularly in a remote team environment.</li>
<li><strong>Hold dedicated “Ask Me Anything”(AMA) sessions.</strong><br />
AMA sessions can help frontline managers understand the rationale behind the approach and become comfortable with empowering their teams and giving up control. I remember a time when my team participated in one of these sessions, and it helped us better understand the benefits of Agile methodology because it put everyone on the same page and made everyone more confident in the overall direction.</li>
</ul>

<p>Failing to prioritize collaboration and communication can have serious consequences for an Agile project. Miscommunications and misunderstandings can lead to delays, missed deadlines, and even project failure. Team members may become demotivated or disengaged if they feel they are working in isolation or not being heard. In the worst-case scenario, the lack of collaboration and communication can lead to a breakdown in the project team, which can be difficult to recover from.</p>

<h2 id="refactoring-and-code-reviews">Refactoring And Code Reviews</h2>

<p>Refactoring refers to the process of improving the internal structure of code without changing its external behavior. It is done to enhance code readability, maintainability, and performance. On the other hand, code review is the process of examining code to identify issues or defects that may affect its quality, security, or functionality.</p>

<h3 id="refactoring">Refactoring</h3>

<p>Refactoring is the process of restructuring existing code without changing its external behavior. It should be done frequently in Agile projects &mdash; often in the middle of a sprint &mdash; to keep the codebase clean and avoid <a href="https://css-tricks.com/defining-and-dealing-with-technical-debt/">technical debt</a>. Here are some steps on how to carry out refactoring in Agile:</p>

<ul>
<li>Identify the parts of the codebase that need refactoring.</li>
<li>Discuss with the team why refactoring is necessary and the benefits it can bring.</li>
<li>Prioritize the refactoring tasks based on their impact on the project.</li>
<li>Break down the refactoring tasks into small, manageable chunks.</li>
<li>Refactor the code while ensuring that it still passes all the tests.</li>
<li>Get feedback from the team and stakeholders on the refactored code.</li>
</ul>

<h3 id="code-review">Code Review</h3>

<p>A code review is a process of systematically reviewing the code written by other team members. It aims to improve the code’s quality, find bugs, and ensure it adheres to coding standards. A code review should be done early and often in Agile projects to ensure that the codebase is always of high quality. Here are some steps on how to carry out a code review in Agile:</p>

<ul>
<li>Assign a team member to review the code written by another team member.</li>
<li>Review the code for readability, maintainability, and adherence to the coding standards.</li>
<li>Provide feedback on the code and suggest improvements.</li>
<li>Discuss the feedback with the code author and come up with a plan to address the issues.</li>
<li>Make sure that the code changes are reviewed again after they are implemented to ensure that they meet the desired quality standards.</li>
</ul>

<p>Overall, refactoring and code review are essential practices in Agile methodologies that help ensure the code is of high quality and meets the customer’s needs. By incorporating these practices into the development process, the team can improve collaboration, reduce technical debt, and deliver high-quality software faster.</p>

<div class="partners__lead-place"></div>

<h2 id="agile-compared-to-traditional-workflows">Agile Compared To Traditional Workflows</h2>

<p>Traditional workflows refer to development methodologies that follow a <strong>linear, sequential process</strong>, where each phase of development must be completed before moving on to the next phase, with a focus on ensuring that all requirements are clearly defined before development begins. Some examples of traditional workflows include the <a href="https://business.adobe.com/blog/basics/waterfall">Waterfall model</a>, the <a href="https://www.javatpoint.com/software-engineering-v-model">V-model</a>, the <a href="https://blog.logrocket.com/product-management/risk-driven-development-with-the-spiral-model/">Spiral model</a>, and the <a href="https://en.wikipedia.org/wiki/Rational_unified_process">Rational Unified Process</a>. These methodologies are often referred to as “plan-driven” or “heavyweight” methodologies, as they involve extensive planning and documentation upfront, with less flexibility for changes during the development process.</p>

<p>Take a look at the Waterfall model, for example. This model, also known as the “classic life cycle model,” is based on a series of well-defined phases, with each phase depending on the successful completion of the previous one.</p>

<p>The phases of the Waterfall model typically include requirements gathering, design, implementation, testing, deployment, and maintenance. Once one phase is completed, the next phase begins, and there is no going back to the previous phase. This means that the Waterfall model follows a “top-down” approach, where each phase is dependent on the previous phase’s success. And, true to its name, the process resembles a waterfall.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png"
			
			sizes="100vw"
			alt="Waterfall model which consists of requirements gathering, design, implementation, testing, deployment, and maintenance"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Image credit: <a href='https://business.adobe.com/blog/basics/waterfall'>Abobe Workfront</a>. (<a href='https://files.smashing.media/articles/impact-agile-methodologies-code-quality/waterfall-model.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>One of the key characteristics of the Waterfall model is that it is <strong>heavily focused on planning and documentation</strong>. Before the development team begins coding, the project requirements and design specifications must be fully documented. This documentation is then used to guide the entire development process.</p>

<p>While the Waterfall model has been a popular development process for many years, it has several limitations. For instance, the linear and sequential nature of the model can be inflexible, making it challenging to incorporate changes and feedback throughout the development process. It also puts a lot of emphasis on up-front planning, which can be time-consuming and costly. Plus, we all know that even the best-laid plans don’t always go right.</p>

<p>As a result, many software development teams have shifted towards using Agile methodologies instead of the Waterfall model. Agile methodologies offer <strong>greater flexibility and collaboration</strong>, enabling teams to adjust their approach as they gather feedback and insights throughout the development process.</p>

<p>Here are some key differences between Agile methodologies and traditional workflows:</p>

<table class="tablesaw break-out">
    <thead>
        <tr>
            <th></th>
            <th>Agile</th>
      <th>Traditional</th>
        </tr>
    </thead>
    <tbody>
        <tr>
      <td><strong>Flexibility</strong></td>
            <td>Flexible and adaptable.</td>
      <td>Rigid and structured.</td>
        </tr>
        <tr>
      <td><strong>Customer involvement</strong></td>
            <td>Prioritize customer involvement and feedback throughout the development process.</td>
      <td>Limited customer involvement, with the customer being presented with the final product at the end of the process.</td>
        </tr>
        <tr>
      <td><strong>Team structure</strong></td>
            <td>Cross-functional and collaborative.</td>
      <td>Specialized and isolated.</td>
        </tr>
    <tr>
      <td><strong>Testing</strong></td>
            <td>Occurs throughout the development process.</td>
      <td>Occurs the end of the development cycle.</td>
        </tr>
    </tbody>
</table>

<p>While traditional workflows may have some advantages, such as providing a clear roadmap and a structured approach, I believe Agile methodologies are better suited for today’s fast-paced, ever-changing software development landscape. Agile methodologies offer the flexibility and adaptability necessary to meet changing requirements and deliver high-quality software products.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In conclusion, adopting Agile methodologies can have a significant positive impact on code quality. By prioritizing collaboration and communication, implementing test-driven development, and regularly conducting code reviews and refactoring, development teams can ensure that the code they produce is high-quality, maintainable, and meets the customer’s needs.</p>

<p>It’s worth noting that Agile methodologies are not without their challenges, such as the potential for scope creep. You can imagine how a flexible process that encourages frequent collaboration and feedback could lead to a project growing more legs than it needs. That said, Organizations that have adopted Agile methodologies <a href="https://www.zippia.com/advice/agile-statistics/#:~:text=The%20most%20well%2Dknown%20companies,40%25%20when%20compared%20to%20waterfall">report higher levels of customer satisfaction, faster time-to-market, and overall improved project success rates</a>. As the industry continues to evolve, it’s likely that we will see more and more organizations embrace Agile methodologies to improve code quality and project outcomes.</p>

<h3 id="further-reading-on-smashingmag">Further Reading On SmashingMag</h3>

<ul>
<li>“<a href="https://www.smashingmagazine.com/2020/04/collaborative-coding-ultimate-career-hack/">Why Collaborative Coding Is The Ultimate Career Hack</a>”, Bobby Sebolao</li>
<li>“<a href="https://www.smashingmagazine.com/2019/12/beyond-sprint-alternative-integrating-teams/">Beyond Sprint 0: An Alternative For Integrating Teams</a>”, Shamsi Brinn</li>
<li>“<a href="https://www.smashingmagazine.com/2019/11/adapting-agile-part-time-teams/">Adapting Agile For Part-Time Teams</a>”, Philip Kiely</li>
<li>“<a href="https://www.smashingmagazine.com/2019/06/bringing-healthy-code-review-mindset/">Bringing A Healthy Code Review Mindset To Your Team</a>”, Sandrina Pereira</li>
<li>“<a href="https://www.smashingmagazine.com/2019/08/better-design-process-organization/">Bringing A Better Design Process To Your Organization</a>”, Eric Olive</li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(gg, yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Suzanne Scacca</author><title>Where Does SEO Belong In Your Web Design Process?</title><link>https://www.smashingmagazine.com/2020/02/seo-web-design-process/</link><pubDate>Fri, 28 Feb 2020 11:30:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2020/02/seo-web-design-process/</guid><description>The word “SEO” holds a lot of weight. We know how critical it is to the success of a website and, yet, it often becomes one of those things that’s left until the very end of a web design project to deal with. Or, worse, it’s pushed onto one person’s plate who likely isn’t capable of doing all that needs to be done. SEO should be a team sport — and that’s what today’s post is all about.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2020/02/seo-web-design-process/" />
              <title>Where Does SEO Belong In Your Web Design Process?</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Where Does SEO Belong In Your Web Design Process?</h1>
                  
                    
                    <address>Suzanne Scacca</address>
                  
                  <time datetime="2020-02-28T11:30:00&#43;00:00" class="op-published">2020-02-28T11:30:00+00:00</time>
                  <time datetime="2020-02-28T11:30:00&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>We all have a role to play in the building of a website. Designers create beautiful and interactive interfaces. Copywriters create messaging that gets visitors to take notice and action. Developers bring it all together with code.</p>

<p>But there’s one piece of the puzzle that can’t be handed off to just one person. And that’s SEO.</p>

<p>If you’re building websites for clients and they’re expecting impressive outcomes in the end (i.e. high conversion rates), SEO <em>has</em> to be part of your process. You can’t just leave it in the hands of your writer or a dedicated SEO and assume that’s enough.</p>

<p>Google is a demanding overlord and we must appease it if we want our websites to reach the top of search. And what that means is taking a well-rounded approach to SEO throughout the lifecycle of the website design and development process.</p>

<p>If you haven’t accounted for this already or you want to make sure you’ve covered all the bases in what you currently do, this post is for you. I’m going to run through when and how SEO needs to enter the picture in your workflow. In addition, I’ve included an SEO checklist at the bottom of this post that you and your team can adapt to your workflow.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></strong>, Steven Hoober’s brand-new guide on <strong>designing for mobile</strong> with proven, universal, human-centric guidelines. <strong>400 pages</strong>, jam-packed with in-depth user research and <strong>best practices</strong>.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/14bcab88-b622-47f6-a51d-76b0aa003597/touch-design-book-shop-opt.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png"
    alt="Feature Panel"
    width="480"
    height="697"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="where-does-seo-belong-in-your-web-design-process">Where Does SEO Belong In Your Web Design Process?</h2>

<p>SEO should be something you’re always thinking about and planning for, from the prospecting phase all the way to the launch date.</p>

<h3 id="seo-during-the-proposal-phase">SEO During The Proposal Phase</h3>

<p>When you talk to a prospect about what they need your help for, they’re going to focus on the website itself.</p>

<blockquote>“I need a website so I can sell my products online/grow my presence/get new customers.”</blockquote>

<p>But that’s not <em>really</em> what they’re asking for. What they want is a website to help their business get found in Google and to convert visitors, which requires something more complex from you than just slapping together some copy and designs.</p>

<p>You know that the website needs to be optimized for search if the website is to do what the client needs it to. Because of this, it’s going to impact things like cost, timeline and process flow. <strong>All of these details should be mapped out on your end as you prepare the proposal.</strong></p>

<p>As for what you actually tell your clients? This is where things get tricky.</p>

<p>You have to somehow address SEO with your prospect 1) to set the right expectations and 2) to justify what you’re about to propose to them in terms of scope and cost. The only problem is, some clients might know the term “SEO”, but they don’t really understand what it entails.</p>

<p>The conversation could quickly devolve into something like this:</p>

<blockquote><strong>You</strong>: [You explain the details of your design offering and mention that SEO is part of it.]<br /><br /><strong>Client</strong>: “Oh, great. I have a list of 20 keywords I want included in every page.”<br /><br /><strong>You</strong>: “Well, that’s not really what search engine optimization is. If you want your website to perform well, you need to pay attention to things like caching, security and mobile-first design.”<br /><br /><strong>Client</strong>: “What are you talking about? Cashing? What even is that? I thought you said you do SEO. I want to rank for these 20 keywords.”</blockquote>

<p>It’s your job to get clients the results they need, not to try and explain to them the technicalities of how you do it. That’s why they’re paying you to do this, after all. So, here’s what I’d recommend for your proposal and early discussions with clients:</p>

<p>First, let your website do all the talking about SEO like <a href="https://upqode.com/">UPQODE</a>’s does:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png"
			
			sizes="100vw"
			alt="UPQODE SEO Services page - list of services"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      UPQODE briefly details the kinds of SEO services it provides. (Image source: <a href='https://upqode.com/'>UPQODE</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d45d2b2e-dbc2-461a-8364-b198494f4c3a/upquode-seo-services.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This would allow you to clearly spell out the kinds of SEO you provide (which will also help those SEO-minded clients find you in the first place). It’s okay to include technical terms here so long as you briefly explain what each is in layman’s terms:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png"
			
			sizes="100vw"
			alt="UPQODE On-Page SEO explanation for clients"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      UPQODE explains what’s involved in on-page SEO. (Image source: <a href='https://upqode.com/'>UPQODE</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/47afbb9e-c5f3-40a2-a7e3-099e8c2355c1/upquode-seo-explainer.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>What I like about this approach is that it enables you to say “We’re going to do X, Y and Z” while framing it in a light that the client actually understands. In this case, what you’d really be saying is “We handle all the technical stuff so your site’s visibility grows in search and, consequently, you get more traffic.”</p>

<p>This is how you should be talking to your prospects and laying out SEO-related details in your proposals and contracts, too.</p>

<p>In other words, don’t delve too much into your SEO tasks. Instead, just spell out the benefits. For example:</p>

<ul>
<li>Responsive web design that looks great on all devices.</li>
<li>Web pages that load in three seconds or less for optimal visitor experiences.</li>
<li>Tightened up security to keep all your business data as well as your visitors’ data private.</li>
<li>Content that’s easy for humans to read and even easier for Google bots to understand.</li>
<li>Custom-built user pathways that turn visitors into customers in no time.</li>
</ul>

<p>The goal is to get them onboard with your search-optimized web design services and perhaps even ongoing maintenance and support afterwards. To do that, you have to clearly convey the benefits without getting them wrapped up in the technicalities of SEO.</p>

<h3 id="seo-during-the-setup-and-planning-phase">SEO During The Setup And Planning Phase</h3>

<p>In the early phases of an approved project, SEO shouldn’t be far from your mind. While you might not actively be working on optimizations yet, it’s a good idea to make sure the baseline you’re working from won’t cause more work for you down the line.</p>

<p>Here are some things to keep in mind:</p>

<p><strong>Review the Client’s Design Assets</strong></p>

<p>You probably ask clients to provide you with assets, logins and even copy before a project gets underway. While this is mainly to protect yourself from scope creep, it can also come in handy for SEO.</p>

<p>Say your client hands over logos and other image assets that are really low quality or look super outdated. The earlier you have these assets in hand, the sooner you can let them know that they need to be replaced if they want people to take their website seriously.</p>

<p>If visitors don’t like the look of a website, they’re going to abandon it without fail and that high bounce rate is going to kill the site’s ranking. So, make sure your clients don’t stand in the way of the results you’re trying to help them achieve.</p>

<p><strong>Work in Tandem with the Copywriter</strong></p>

<p>Even if a professional copywriter is creating the content for your website, if you’re not working closely with them from the start, there could be problems.</p>

<p>Web design agencies often debate the merits of content-first website development vs. design-first. The truth is, they should be created together. If you don’t, you put the whole project at risk.</p>

<p>For starters, a writer and designer working in isolation are bound to come up with different ways to handle style and layout. But if you establish guidelines from the get-go (which you can easily do with <a href="https://wireframe.cc/">wireframes</a>), you can avoid any disjoint in how the copy and design are created.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png"
			
			sizes="100vw"
			alt="Wireframe.cc wireframe for mobile page layout"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Designers can use a tool like Wireframe.cc to create wireframes that both they and the writer can work out of. (Image source: <a href='https://wireframe.cc/'>Wireframe.cc</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/184f08b6-b645-42e4-bd15-e581aaa909b7/wireframe-for-designer-writer.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>You’re going to wireframe any website you build anyway, so why not provide a copy of it to the writer so you two can be on the same page from the beginning? Even better, why not collaborate with the writer? They might not know design techniques or best practices, but they can certainly provide insight on things like optimal text length, the priority of certain sales or marketing messages and so on.</p>

<p>Then, there’s the matter of optimizing copy for search. Ideally, you’d want to work with a copywriter who can do the following:</p>

<ul>
<li>Create actionable messaging and CTAs,</li>
<li>Naturally weave target keywords into the copy,</li>
<li>Write for user intent,</li>
<li>Write in HTML,</li>
<li>Create copy that’s both readable and scannable,</li>
<li>Build a system of internal links from page to page,</li>
<li>Create meta tags and optimize URLs for search,</li>
<li>Write alt tags for images.</li>
</ul>

<p>The more of this that gets built into the copy from the get-go, the less back-and-forth you have to do with them later. It’ll also spare you the trouble of trying to fix this on your own (which you shouldn’t attempt to do).</p>

<p><strong>Design for Sales Funnels</strong></p>

<p>In order to increase conversions on a site, you should be <a href="https://www.smashingmagazine.com/2019/12/design-profitable-sales-funnels-mobile/">designing sales funnels</a> into them. But sales funnels aren’t just a series of steps that you lay down for visitors on the website.</p>

<p>It all begins with understanding user intent outside of the site. If you know what draws visitors to your site from search engines and social media, you can design your metadata <em>and</em> landing pages to align with that intent.</p>

<p>Again, if you do the research and planning upfront with SEO in mind, you’ll have less cleanup work to do later.</p>

<div class="partners__lead-place"></div>

<h3 id="seo-during-design-and-development">SEO During Design And Development</h3>

<p>This, obviously, is the most important and labor-intensive stage for you. <strong>And while it’s easy to get wrapped up in designing and coding, it’s important not to lose sight of SEO here.</strong></p>

<p>What I’d recommend is creating a universal SEO checklist you can use from project to project. If you account for every possible optimization now, you can take the guesswork out of SEO. Plus, a checklist allows you to become better acquainted with everything that needs to be done, which will enable you to find more efficient ways of building search optimizations into your process.</p>

<p>To help you along, I’ve created the following SEO checklist. Feel free to copy and use for your own needs:</p>

<ul>
<li><strong>Technical SEO</strong></li>
  <ul>
    <li>Web hosting with 99.9%+ uptime</li>
    <li>Domain with clean web history</li>
    <li>SSL certificate installed</li>
    <li>Firewall implemented</li>
    <li>Caching enabled (page, browser, object, etc.)</li>
    <li>Image compression and resizing (in-house system or automated)</li>
    <li>Automated backups</li>
    <li>Google Analytics account connected</li>
    <li>Google Analytics goal tracking, ecommerce tracking and other special tracking enabled</li>
    <li>Google Search Console account connected</li>
    <li>XML sitemap set up and submitted to Google</li>
    <li>Separate sitemap submitted for images and for videos</li>
    <li>Robots.txt set up</li>
    <li>Schema.org markup (when relevant) written</li>
  </ul>
</ul>

<ul>
<li><strong>Design SEO</strong></li>
  <ul>
    <li>Information architecture mapped out</li>
    <li>Responsive web design</li>
    <li>Mobile-first web design</li>
    <li>1 clear CTA per page</li>
    <li>Custom 404 page set up</li>
    <li>All links, buttons and forms tested and working</li>
  </ul>
</ul>

<ul>
<li><strong>On-page SEO</strong></li>
<ul>
  <li>1 unique focus keyword per page</li>
    <li>Focus keyword density between 1-3%</li>
    <li>50-60 character meta title including the focus keyword</li>
    <li>150-160 character meta description including the focus keyword</li>
    <li>Short but descriptive slug including the focus keyword</li>
    <li>Error-free content</li>
    <li>At least 1 relevant internal link per page</li>
    <li>Featured image for each page</li>
    <li>Descriptive alt text for each image</li>
    <li>Header tags used (focus keyword included in at least 1)</li>
    <li>Headers appear every 300 words or so</li>
    <li>Sentences stretch no more than two lines</li>
    <li>Paragraphs stretch no more than five lines</li>
    <li>Duplicate content analysis</li>
    <li>Plagiarism check</li>
  </ul>
</ul>

<ul>
<li><strong>Local SEO</strong></li>
  <ul>
    <li>Google My Business page set up</li>
    <li>Geo-specific keywords included</li>
    <li>Location-specific pages created (when relevant)</li>
    <li>Contact information provided (e.g. phone number, address, etc.)</li>
  </ul>
</ul>

<ul>
<li><strong>Ongoing SEO Support</strong></li>
  <ul>
    <li>Web server uptime, speed and security analysis</li>
    <li>Page speed testing</li>
    <li>Security monitoring</li>
    <li>Google blacklist monitoring</li>
    <li>Keyword rank monitoring</li>
    <li>Broken link checking</li>
    <li>Software updates</li>
  </ul>
</ul>

<h3 id="a-few-notes">A Few Notes</h3>

<ol>
<li>Anything that’s not relevant to the kinds of clients you serve or the kinds of services you offer, delete the row.</li>
<li>If there’s anything I’m missing, feel free to add it on (like if you specialize in e-commerce design and want to prep product pages to appear in Google Shopping results).</li>
<li>If you’re not comfortable checking the on-page SEO stuff, hand it off to a proofreader or editor (someone who didn’t do the copywriting).</li>
</ol>

<p>For those of you looking for additional opportunities to make money, this SEO checklist can also be used to analyze an existing website and present a prospective client with a website redesign or optimization plan.</p>

<h2 id="wrapping-up">Wrapping Up</h2>

<p>Keyword optimization and link building are only part of the SEO puzzle. As a web designer or developer, you have a huge contribution to make here as well.
Whether it’s in the quality of code written on the backend, the way images are optimized or how well-secured the site is, these are the kinds of tasks you’re responsible for managing that no writer or SEO is going to or should handle. And, without these optimizations, Google and your visitors will fail to take notice of the site you worked so hard to build for them.</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2022/06/adding-search-website-sitesearch360/">Adding Search To Your Site In 15 Minutes</a></li>
<li><a href="https://www.smashingmagazine.com/2024/07/designing-sustainable-e-commerce-experiences/">When Friction Is A Good Thing: Designing Sustainable E-Commerce Experiences</a></li>
<li><a href="https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/">Improving The Double Diamond Design Process</a></li>
<li><a href="https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/">The Impact Of Agile Methodologies On Code Quality</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(ra, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Sandrina Pereira</author><title>How Frontend Developers Can Empower Designer’s Work</title><link>https://www.smashingmagazine.com/2019/10/frontend-developers-empower-designers-work/</link><pubDate>Wed, 16 Oct 2019 12:30:59 +0200</pubDate><guid>https://www.smashingmagazine.com/2019/10/frontend-developers-empower-designers-work/</guid><description>As a frontend developer, I want to apologize to the designers out there for all the misunderstandings that have happened in the past. I think it’s time for us developers to improve our awareness of the designers’ role and show them that we can &amp;mdash; and should &amp;mdash; look beyond our own screens.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2019/10/frontend-developers-empower-designers-work/" />
              <title>How Frontend Developers Can Empower Designer’s Work</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>How Frontend Developers Can Empower Designer’s Work</h1>
                  
                    
                    <address>Sandrina Pereira</address>
                  
                  <time datetime="2019-10-16T12:30:59&#43;02:00" class="op-published">2019-10-16T12:30:59+02:00</time>
                  <time datetime="2019-10-16T12:30:59&#43;02:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>This article is mostly directed at you, dear Frontend Developer, who enjoys implementing user interfaces but struggles in aligning expectations with designers you work with. Perhaps you are referred to as the “UI Developer” or “UX Engineer.” Regardless of the title that you carry around, your job (and as well as mine) consists of more than breathing life into design files. We are also responsible for <strong>filling the gap between the design and development workflows</strong>. However, when crossing that bridge, we are faced with multiple challenges.</p>

<p>Today, I’d like to share with you practical tips that have helped me to collaborate more efficiently with designers in the past years.</p>

<p>I believe it’s our job, as UI Developers, to not only help designers in their journey to learn how the web works, but also to get to know their reality and learn their language.</p>

<h2 id="understanding-ux-designers-background">Understanding UX Designers’ Background</h2>

<p>Most of the UX designers (also referred to as Web Designers or Product Designers) out there took their first steps in the design world through tools like Photoshop and Illustrator. Perhaps they were <em>Graphic Designers</em>: their main goal was to create logos and brand identities and to design layouts for magazines. They could also have been <em>Marketing Designers</em>: printing billboards, designing banners and creating infographics.</p>

<p>This means that most UX designers spent their early days designing for print, which is a totally different paradigm from their current medium, the screen. That was their first big challenge. When dealing with print, designers cared about pixel alignment, but on a fixed area (paper). They didn’t have to contend with a dynamic layout (screens). Thinking about text breaking or states of interactions was simply not part of their job either. Designers also had complete freedom over colors, images, and typography without performance constraints.</p>

<p>Fortunately, there have been many efforts from the self-taught UX designers community, to teach <a href="https://uxdesign.cc/development-fundamentals-for-ux-designers-caf759724874">development fundamentals</a>, discuss whether designers should <a href="https://uxdesign.cc/should-ux-desingers-learn-to-code-an-ex-developers-perspective-5f6cf04eafc2">learn to code</a> and understand <a href="https://www.abstract.com/blog/developer-handoff-for-designers/">how to best perform hand-off to developers</a>. The same held true for the development side as well (more about that in a minute). However, there is still friction happening between the two fields.</p>

<p>On the one hand, designers complaining each time an implementation doesn’t match their designs or feeling misunderstood when those are rejected by the developers without a clear explanation. On the other hand, developers might take for granted that designers know something technical when that might not be true. I believe we can all do better than that.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/typescript-in-50-lessons/">“TypeScript in 50 Lessons”</a></strong>, our shiny new guide to TypeScript. With detailed <strong>code walkthroughs</strong>, hands-on examples and common gotchas. For developers who know enough <strong>JavaScript</strong> to be dangerous.</p>
<a data-instant href="/printed-books/typescript-in-50-lessons/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="/printed-books/typescript-in-50-lessons/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/2732dfe9-e1ee-41c3-871a-6252aeda741c/typescript-panel.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="embracing-a-new-way-of-thinking">Embracing A New Way Of Thinking</h2>

<p>The websites and apps that we are building will be displayed on a wide range of screen sizes. Each person will use them on multiple devices. Our common goal is to create a familiar experience across their journeys.</p>

<p>When we, as developers, think that designers are being picky about pixel alignments, we need to understand why that is. We need to recognize that it’s beyond fidelity and consistency. It’s about the sum of all the parts working together. It’s cohesion. We have to embrace it and do our best to accomplish it. <strong>Learning the fundamentals of design principles is a good starting point</strong>. Understand the importance of selecting the right colors, how the hierarchy works, and why white space matters.</p>

<p><strong>Note</strong>: <em>There’s an online course known as “<a href="https://frontendmasters.com/courses/design-for-developers/">Design for Developers</a>” and a book called “<a href="https://refactoringui.com/book/">Refactoring UI</a>” &mdash; both are great to get you started. With these, you’ll be able to implement user interfaces with a sharp eye for detail and gain significant leverage when communicating with designers.</em></p>

<h2 id="magnifying-your-designers-awareness">Magnifying Your Designers’ Awareness</h2>

<p>You might take for granted that designers know the web as much as you do. Well, they might not. Actually, they don’t have to! It’s our responsibility, as developers, to keep them updated with the current state of the web.</p>

<p>I’ve worked with the two sides of this spectrum: Designers who think that anything can be built (such as complex filters, new scroll behaviors or custom form inputs) without giving browser compatibility a thought. Then, there are designers with assumptions about the “low limitations of the web” and just assume by themselves that something is impossible to implement. We need to <strong>show them the true possibilities of web design</strong> and not let the limitations hold back their skills.</p>

<h3 id="teach-them-code-not-how-to-code">Teach Them Code, Not How To Code</h3>

<p>This seems contradictory but bear with me: knowing <em>how to code</em> is at the core of a developer’s job. We work in a fast-paced industry with new stuff popping up every day. It would be a hypocritical request from us to demand designers to learn how to code. However, we can help them to <em>understand</em> code.</p>

<p><strong>Sit next to the designer you work with</strong> for 15 minutes and teach them how they can see for themselves whether the specs of an element are correct and how to change them. I find <a href="https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector">Firefox Page Inspector</a> remarkably user-friendly for this.</p>

<p>Nowadays, it’s a joy to visualize layouts, debug CSS animations and tweak typography. Show them a ready-to-use code playground like <a href="https://codepen.io/">Codepen</a> for them to explore. They don’t need to know all CSS specs to understand how the layout paradigm works. However, they need to know how elements are created and behave in order to empower their daily work.</p>

<h3 id="include-designers-in-the-development-process">Include Designers In The Development Process</h3>

<p>Invite designers to join you in the stand-up meeting, to be part of the QA process and to sit down with you while you refine visual details in your implementations. This will make them understand the constraints of the web and, soon enough, they’ll recognize why a feature takes time to implement.</p>

<h3 id="ask-designers-to-include-you-in-their-design-process">Ask Designers To Include You In Their Design Process</h3>

<p>You’ll realize that they do much more than “make things pretty”. You’ll learn more about the research process and how user testing is done. You’ll discover that for each design proposal they show to you, several other studies were previously dropped. When designers request a change, ask the reason behind it, so you can <strong>learn more about the decisions being made</strong>. Ultimately, you’ll start to understand why they are picky about white space and alignments, and hopefully, soon you’ll be too!</p>

<p>I find it crucial to treat frontend development as a core part of the design process, and design as a core part of the development process. Advocating <strong>a mindset where everyone gets the chance to be involved</strong> in the design and development cycle will help us all to better understand each other’s challenges and to create great experiences as well.</p>

<div class="partners__lead-place"></div>

<h2 id="we-may-use-different-tools-but-we-must-speak-the-same-language">We May Use Different Tools, But We Must Speak The Same Language</h2>

<p>Now that we are starting to understand each other&rsquo;s workflow a little better, it’s time for the next step: to speak the same language.</p>

<h3 id="looking-beyond-the-code-editor">Looking Beyond The Code Editor</h3>

<p>Once you start to pay attention to your surroundings, you’ll be better equipped to tackle problems. Get to know the business better and be willing to listen to what designers have to say. That will make you a team member with richer contributions to the project. Collaborating in areas beyond our expertise is the key to creating meaningful conversations and mutual trust.</p>

<h3 id="using-ui-systems-as-a-contract">Using UI Systems As A Contract</h3>

<p>Ask designers to share their design system with you (and <a href="https://medium.com/free-code-camp/how-to-construct-a-design-system-864adbf2a117">if they don’t use one, it’s never too late to start</a>). That will save you the bother of handpicking the colors used, figuring out margins or guessing a text style. Make sure you are familiar with the UI System as much as they are.</p>

<p>You might already be familiar with the component-based concept. However, some designers might not perceive it in the same way as you do. Show them how components can help you to build user interfaces more efficiently. Spread that mindset and also say bye-bye to similar-but-not-equal-names: <em>header vs hero, pricing info vs price selector</em>. When a piece of the user interface (a.k.a ‘a component’) is built, <strong>stride to use the same names</strong> so they can be reflected in both design and code files. Then, when someone says, <em>“We need to tweak the proposal invitation widget,”</em> everyone knows exactly what is being talked about.</p>

<h3 id="acknowledging-the-real-source-of-truth">Acknowledging The Real Source Of Truth</h3>

<p>Despite the fact that the user interface is first created in the design files, the real source of truth is on the development side. At the end of the day, it is what people actually see, right? When a design is updated, it’s a good idea to leave a side note about its development status, especially in projects where a large number of people are involved. This trick helps to keep the communication smooth, so nobody (including you) wonders: “<em>This is different from the live version. Is it a bug or hasn’t so-and-so been implemented just yet?</em>”</p>

<h3 id="keeping-the-debt-under-control">Keeping The Debt Under Control</h3>

<p>So, you know all about <em>technical debt</em> &mdash; it happens when the cost to implement something new is high because of a shortcut we took in the past to meet a deadline. The same can happen on the design side too and we call it <em>design debt</em>.</p>

<p>You can think about it like this: The higher the UX &amp; UI inconsistency, the higher the debt (technical and design). One of the most common inconsistencies is in having different elements to represent the same action. <strong>This is why bad design is usually reflected in bad code</strong>. It’s up to all of us, both as designers and developers, to <a href="https://uxdesign.cc/what-is-design-debt-and-why-you-should-treat-it-seriously-4366d33d3c89">treat our design debt seriously</a>.</p>

<h3 id="being-accessible-doesn-t-mean-it-has-to-be-ugly">Being Accessible Doesn’t Mean It Has To Be Ugly</h3>

<p>I’m really pleased to see that both we, as developers and designers, are finally starting to bring accessibility into our work. However, a lot of us still think that designing accessible products is hard or limits our skills and creativity.</p>

<p>Let me remind you that we are not creating a product just for ourselves. <strong>We are creating a product to be used by all the people</strong>, including those who use the product in different ways from you. Take into account how individual elements can be more accessible while keeping the current userflows clear and coherent.</p>

<p>For example, if a designer really believes that creating an enhanced select input is necessary, stand by their side and work together to <a href="https://uxdesign.cc/designing-for-accessibility-is-not-that-hard-c04cc4779d94">design</a> and <a href="https://medium.com/@matuzo/writing-css-with-accessibility-in-mind-8514a0007939">implement</a> it in an accessible way to be used by a wide range of people with diverse abilities.</p>

<div class="partners__lead-place"></div>

<h2 id="giving-valuable-feedback-to-designers">Giving Valuable Feedback To Designers</h2>

<p>It’s unavoidable that questions will pop up when going through the designs. However, that’s not a reason for you to start complaining about the designers’ mistakes or about their ambitious ideas. The designers are not there to drive you mental, they just don’t always intuitively know what you need to do your job. The truth is that, in the past, you didn’t know about this stuff either, so be patient and embrace collaboration as a way of learning.</p>

<h3 id="the-earlier-the-feedback-the-better">The Earlier The Feedback, The Better</h3>

<p>The timing for feedback is crucial. The feedback workflow depends a lot on the project structure, so there isn’t a one-size-fits-all solution for it. However, when possible, I believe we should aim for <strong>a workflow of periodic feedback</strong> &mdash; starting in the early stages. Having this mindset of open collaboration is the way to reduce the possibility of unexpected big re-iterations later in the road. Keep in mind that the later you give the designer your first feedback, the higher will be the cost for them to explore a new approach if needed.</p>

<h3 id="explain-abstract-ideas-in-simple-terms">Explain Abstract Ideas In Simple Terms</h3>

<p>Remember when I said that performance was not a concern of the designers’ previous jobs? Don’t freak out when they are not aware of <a href="https://www.sarasoueidan.com/blog/svg-tips-for-designers/">how to create optimized SVGs for the web</a>. When faced with a design that requires a lot of different fonts to be loaded, explain to them why we should minimize the number of requests, perhaps even take advantage of <a href="https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts/">Variable Fonts</a>. Asides from loading faster, it also provides a more consistent user experience. Unless designers are keen to learn, avoid using too many technical terms when explaining something. You can see this as an opportunity of improving your communication skills and clarifying your thoughts.</p>

<h3 id="don-t-let-assumptions-turn-into-decisions">Don’t Let Assumptions Turn Into Decisions</h3>

<p>Some questions about a design spec only show up when we get our hands dirty in the code. To speed things up, we might feel tempted to make decisions based on our assumptions. Please, don’t. Each time you turn an assumption into a decision, you are risking the trust that the design team puts on you to implement the UI. Whenever in doubt, <strong>reach out and clarify your doubts</strong>. This will show them that you care about the final result as much as they do.</p>

<h3 id="don-t-do-workarounds-by-yourself">Don’t Do Workarounds By Yourself</h3>

<p>When you are asked to implement a design that is too hard, don’t say <em>“It’s impossible”</em> or start to implement a cheap alternative version of it by yourself. This immediately causes friction with the design team when they see their designs were not implemented as expected. They might react angrily, or not say anything but feel defeated or frustrated. That can all be avoided if we explain to them why something it’s not possible, in simple terms and suggest alternative approaches. <strong>Avoid dogmatic behaviors and be open to collaborating on a new solution</strong>.</p>

<p>Let them know about the <a href="https://developer.mozilla.org/en-US/docs/Glossary/Graceful_degradation">Graceful Degradation</a> and <a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement">Progressive Enhancement</a> techniques and build together an ideal solution and a fallback solution. For example, we can <a href="https://www.smashingmagazine.com/2017/07/enhancing-css-layout-floats-flexbox-grid/">enhance a layout from flexbox to CSS Grid</a>. This allows us to respect the core purpose of a feature and at the same time make the best use of web technologies.</p>

<p>When it comes to animations, let’s be real: deep down you are as thrilled to implement the next <em>wow</em> animation as much as the designers are to create it. The difference between us and them is that we are more aware of the web’s constraints. However, don’t let that limit your own skills! The web evolves fast, so we must use that in our favor.</p>

<p>The next time you are asked to bring a prototype to life, try not to reject it upfront or do it all by yourself. See it as an opportunity to push yourself. Animations are one of the pickiest parts of web development, so make sure to refine each keyframe with your designer &mdash; in person or by sharing a private synced link.</p>

<h3 id="think-beyond-the-ideal-state-mdash-together">Think Beyond The Ideal State &mdash; Together</h3>

<p>Here’s the thing: it’s not all about you. One of the designers’ challenges is to really understand their users and present the designs in the most attractive way to sell to the Product Manager. Sometimes they forget about what’s beyond the ideal state and developers forget it too.</p>

<p>In order to help avoid these gaps from happening, align with designers the scenario requirements:</p>

<ul>
  <li><strong>The worst-case scenario</strong><br />A scenario where the worst possibilities are happening. This helps designers to say no to fixed content and let it be fluid. What happens if the title has more than 60 characters or if the list is too long? The same applies to the opposite, the empty scenario. What should the user do when the list is empty?</li>
  <li><strong>Interaction states</strong><br />The browser is more than hovering and clicking around. There are a bunch of states: default, hover, focus, active, disable, error… and some of them can happen at the same time. Let’s give them the proper attention.</li>
  <li><strong>The loading state</strong><br />When building stuff locally, we might use mocks and forget that things actually take time to load. Let designers know about that possibility too and show them that are ways to <a href="https://uxdesign.cc/what-you-should-know-about-skeleton-screens-a820c45a571a">make people perceive that things don’t take that long to load</a>.</li>
</ul>

<p>Taking into consideration all these scenarios will save you a lot of time going back and forth during the development phase.</p>

<p><strong>Note</strong>: <em>There’s a great article by Scott Hurff about <a href="https://www.scotthurff.com/posts/why-your-user-interface-is-awkward-youre-ignoring-the-ui-stack/">how to fix bad user interfaces</a> that will take us a step closer to an accessible product.</em></p>

<h3 id="embrace-change-requests">Embrace Change Requests</h3>

<p>Developers are known for not being too happy about someone finding a bug in their code &mdash; especially when it’s a design bug reported by a designer. There are a lot of memes around it, but have you ever reflected how those bugs can compoundingly rot both the quality of the experience as well as your relationship when these design bugs are casually dismissed? It happens slowly, almost like falling asleep. Bit by bit, then all at once. Designers might start out saying, “<em>It’s just a tiny little detail,</em>” until the indifference and resentment builds up and nothing is said. The damage has then already been done.</p>

<p>This situation is two-fold: both to your peers and to your work. Don’t let that happen. <strong>Work on what’s coloring your reaction.</strong> A designer being ‘picky’ can be inconvenient, but it can also be an engineer&rsquo;s shallow interpretation of attentiveness and enthusiasm. When someone tells you that your implementation is not perfect (yet), put your ego aside and show them how you recognize their hard work in refining the final result.</p>

<h3 id="go-off-the-record-once-in-a-while">Go Off The Record Once In A While</h3>

<p>We all have tasks to deliver and roadmaps to finish. However, some of the best work happens off the record. It won’t be logged into the <em>TO DO</em> board and that’s okay. If you find a designer you have a rapport with, go sneak into their workspace and explore together new experiments. You never know what can come from there!</p>

<h2 id="conclusion">Conclusion</h2>

<p>When you are willing to learn from the design team, you are also learning different ways of thinking. You’ll evolve your mindset of collaboration with other areas out of your experience while refining your eye for creating new experiences. Be there to help and be open to learning, because sharing is what makes us better.</p>

<p><br /></p>

<hr /> 

<p><em>This article wouldn’t be possible without the feedback of many great people. I want to gratefully thank to the designers <a href="https://twitter.com/jazmeijer">Jasmine Meijer</a> and <a href="https://www.linkedin.com/in/margaridambotelho/">Margarida Botelho</a> for helping me to share a balanced perspective about the misunderstandings between designers and developers.</em></p>

<h3 id="span-class-rh-related-reading-span-on-smashingmag"><span class="rh">Related Reading</span> on SmashingMag:</h3>

<ul>
<li>“<a title="Read 'Design For Developers'" href="https://www.smashingmagazine.com/2016/12/mistakes-developers-make-when-learning-design/" rel="bookmark">Design For Developers</a>” by <em>Mason Gentry</em></li>
<li>“<a title="Read 'Working Together: How Designers And Developers Can Communicate To Create Better Projects'" href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/" rel="bookmark">Working Together: How Designers And Developers Can Communicate To Create Better Projects</a>” by <em>Rachel Andrew</em></li>
<li>“<a title="Read 'How Frontend Developers Can Help To Bridge The Gap Between Designers And Developers'" href="https://www.smashingmagazine.com/2019/05/frontend-developers-designers/" rel="bookmark">How Frontend Developers Can Help To Bridge The Gap Between Designers And Developers</a>” by <em>Stefan Kaltenegger</em></li>
<li>“<a title="Read 'Which Podcasts Should Web Designers And Developers Be Listening To?'" href="https://www.smashingmagazine.com/2018/04/podcasts-web-designers-developers/" rel="bookmark">Which Podcasts Should Web Designers And Developers Be Listening To?</a>” by <em>Ricky Onsman</em></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(ra, yk, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Sandrina Pereira</author><title>Bringing A Healthy Code Review Mindset To Your Team</title><link>https://www.smashingmagazine.com/2019/06/bringing-healthy-code-review-mindset/</link><pubDate>Wed, 12 Jun 2019 11:30:59 +0000</pubDate><guid>https://www.smashingmagazine.com/2019/06/bringing-healthy-code-review-mindset/</guid><description>Take a moment to remember the last time you collaborated in a code review. Did your team overcome feedback resistance and manage time expectations? Fostering a healthy mindset is the key to build trust and sharing knowledge with your colleagues. In this article, Sandrina Pereira will share how this outcome can be changed by changing your mindset during a code review as a team, as an author and as a reviewer.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2019/06/bringing-healthy-code-review-mindset/" />
              <title>Bringing A Healthy Code Review Mindset To Your Team</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Bringing A Healthy Code Review Mindset To Your Team</h1>
                  
                    
                    <address>Sandrina Pereira</address>
                  
                  <time datetime="2019-06-12T11:30:59&#43;00:00" class="op-published">2019-06-12T11:30:59+00:00</time>
                  <time datetime="2019-06-12T11:30:59&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>A ‘code review’ is a moment in the development process in which <em>you</em> (as a developer) and your colleagues work together and look for bugs within a recent piece of code before it gets released. In such a moment, you can be either the code author or one of the reviewers.</p>

<p>When doing a code review, you might not be sure of what you are looking for. On the other side, when submitting a code review, you might not know what to wait for. This lack of empathy and wrong expectations between the two sides can trigger unfortunate situations and rush the process until it ends in an unpleasant experience for both sides.</p>

<p>In this article, I’ll share how this outcome can be changed by <strong>changing your mindset</strong> during a code review:</p>

<ul>
  <li><a href="#working-as-a-team">As a team</a></li>
  <li><a href="#as-an-author">As an author</a></li>
  <li><a href="#as-a-reviewer">As a reviewer</a></li>
</ul>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><p>Meet <a data-instant href="/the-smashing-newsletter/"><strong>Smashing Email Newsletter</strong></a> with useful tips on front-end, design &amp; UX. Subscribe and <strong>get “Smart Interface Design Checklists”</strong> &mdash; a <strong>free PDF deck</strong> with 150+ questions to ask yourself when designing and building almost <em>anything</em>.</p><div><section class="nlbf"><form action="//smashingmagazine.us1.list-manage.com/subscribe/post?u=16b832d9ad4b28edf261f34df&amp;id=a1666656e0" method="post"><div class="nlbwrapper"><label for="mce-EMAIL-hp" class="sr-only">Your (smashing) email</label><div class="nlbgroup"><input type="email" name="EMAIL" class="nlbf-email" id="mce-EMAIL-hp" placeholder="Your email">
<input type="submit" value="Meow!" name="subscribe" class="nlbf-button"></div></div></form><style>.c-garfield-the-cat .nlbwrapper{margin-bottom: 0;}.nlbf{display:flex;padding-bottom:.25em;padding-top:.5em;text-align:center;letter-spacing:-.5px;color:#fff;font-size:1.15em}.nlbgroup:hover{box-shadow:0 1px 7px -5px rgba(50,50,93,.25),0 3px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025)}.nlbf .nlbf-button,.nlbf .nlbf-email{flex-grow:1;flex-shrink:0;width:auto;margin:0;padding:.75em 1em;border:0;border-radius:11px;background:#fff;font-size:1em;box-shadow:none}.promo-box .nlbf-button:focus,.promo-box input.nlbf-email:active,.promo-box input.nlbf-email:focus{box-shadow:none}.nlbf-button:-ms-input-placeholder,.nlbf-email:-ms-input-placeholder{color:#777;font-style:italic}.nlbf-button::-webkit-input-placeholder,.nlbf-email::-webkit-input-placeholder{color:#777;font-style:italic}.nlbf-button:-ms-input-placeholder,.nlbf-button::-moz-placeholder,.nlbf-button::placeholder,.nlbf-email:-ms-input-placeholder,.nlbf-email::-moz-placeholder,.nlbf-email::placeholder{color:#777;font-style:italic}.nlbf .nlbf-button{transition:all .2s ease-in-out;color:#fff;background-color:#0168b8;font-weight:700;box-shadow:0 1px 1px rgba(0,0,0,.3);width:100%;border:0;border-left:1px solid #ddd;flex:2;border-top-left-radius:0;border-bottom-left-radius:0}.nlbf .nlbf-email{border-top-right-radius:0;border-bottom-right-radius:0;width:100%;flex:4;min-width:150px}@media all and (max-width:650px){.nlbf .nlbgroup{flex-wrap:wrap;box-shadow:none}.nlbf .nlbf-button,.nlbf .nlbf-email{border-radius:11px;border-left:none}.nlbf .nlbf-email{box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);min-width:100%}.nlbf .nlbf-button{margin-top:1em;box-shadow:0 1px 1px rgba(0,0,0,.5)}}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus,.nlbf .nlbf-button:hover{cursor:pointer;color:#fff;background-color:#0168b8;border-color:#dadada;box-shadow:0 1px 1px rgba(0,0,0,.3)}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus{outline:0!important;text-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:inset 0 3px 3px rgba(0,0,0,.3)}.nlbgroup{display:flex;box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);border-radius:11px;transition:box-shadow .2s ease-in-out}.nlbwrapper{display:flex;flex-direction:column;justify-content:center}.nlbf form{width:100%}.nlbf .nlbgroup{margin:0}.nlbcaption{font-size:.9em;line-height:1.5em;color:#fff;border-radius:11px;padding:.5em 1em;display:inline-block;background-color:#0067b859;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.wf-loaded-stage2 .nlbf .nlbf-button{font-family:Mija}.mts{margin-top: 5px !important;}.mbn{margin-bottom: 0 !important;}</style></section><p class="mts mbn"><small class="promo-box__footer mtm block grey"><em>Once a week. Useful tips on <a href="https://www.smashingmagazine.com/the-smashing-newsletter/">front-end &amp; UX</a>. Trusted by 207.000 friendly folks.</em></small></p></div></p>
</div>
</div>
<div class="feature-panel-right-col">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-firechat.svg"
    alt="Feature Panel"
    width="310"
    height="400"
/>

</div>

<p></div>
</aside>
</div></p>

<h2 id="working-as-a-team">👩‍💻👨‍💻 Working As A Team</h2>

<h3 id="foster-out-a-culture-of-collaboration">Foster Out A Culture Of Collaboration</h3>

<p>Before we start, it’s fundamental to understand the value of <a href="https://sophiebits.com/2018/12/25/why-review-code.html">why code needs to be reviewed</a>. Knowledge sharing and team cohesion are beneficial to everyone, however, if done with a poor mindset, a code review can be a huge time consumer with unpleasant outcomes.</p>

<p>The team attitude and behavior should embrace the value of a nonjudgmental collaboration, with the <strong>common goal of learning and sharing</strong> — regardless of someone else’s experience.</p>

<h3 id="include-code-reviews-in-your-estimations">Include Code Reviews In Your Estimations</h3>

<p>A complete code review takes time. If a change took one week to be made, don’t expect the code review to take less than a day. It just doesn’t work like that. Don’t try to rush a code review nor look at it as a bottleneck.</p>

<p>Code reviews are as important as writing the actual code. As a team, remember to <strong>include code reviews in your workflow</strong> and set expectations about how long a code review might take, so everyone is synced and confident about their work.</p>

<h3 id="save-time-with-guidelines-and-automatization">Save Time With Guidelines And Automatization</h3>

<p>An effective way to guarantee consistent contributions is to integrate a <a href="https://github.com/stevemao/github-issue-templates">Pull Request template</a> in the project. This will help the author to submit a healthy PR with a complete description. A PR description should explain what’s the change purpose, the reason behind it, and how to reproduce it. Screenshots and reference links (Git issue, design file, and so on) are the final touches for a self-explanatory submission.</p>

<p>Doing all of this will prevent early comments from reviewers asking for more details. Another way of making code reviews seem less nitpicky is to use <a href="https://github.com/collections/clean-code-linters">linters</a> to find code formatting and code-quality issues before a reviewer even gets involved. Whenever you see a repetitive comment during the review process, look for ways to minimize it (being with better guidelines or code automatization).</p>

<h3 id="stay-a-student">Stay A Student</h3>

<p>Anyone can do a code review, and everyone must receive a code review — no matter the seniority level. Receive any feedback gratefully as an opportunity to learn and to share knowledge. <strong>Look at any feedback as an open discussion</strong> rather than a defensive reaction. As Ryan Holiday says:</p>

<blockquote>“An amateur is defensive. The professional finds learning (and even, occasionally, being shown up) to be enjoyable; they like being challenged and humbled, and engage in education as an ongoing and endless process. (...)”<br /><br />&mdash; Ryan Holiday, <a href="https://www.amazon.com/gp/product/1591847818/">Ego Is the Enemy</a></blockquote>

<p>Stay humble because the second you stop being a student, your knowledge becomes fragile.</p>

<h3 id="the-art-of-selecting-reviewers">The Art Of Selecting Reviewers</h3>

<p>In my opinion, picking the reviewers is one of the most important decisions for an effective and healthy code review as a team.</p>

<p>Let’s say your colleague is submitting a code review and decides to tag “everyone” because, unconsciously, she/he might want to speed up the process, deliver the best code possible or making sure everyone knows about the code change. Each one of the reviewers receives a notification, then opens the PR link and sees a lot of people tagged as reviewers. The thought of “someone else will do it” pops up in their minds, leading to ignore the code review and close the link.</p>

<p>Since nobody started the review yet, your colleague will remind each one of the reviewers to do it, i.e. creating pressure on them. Once the reviewers start to do it, the review process takes forever because everyone has their own opinion and it’s a nightmare to reach a common agreement. Meanwhile, whoever decided to not review the code, is then spammed with zillions of e-mail notifications with all of the review comments, thus creating noise in their productivity.</p>

<p>This is something I see happening more than I’d like: Pull Requests with a bunch of people tagged as reviewers and ending, ironically, in a non-productive code review.</p>

<p>There are some common effective flows when selecting the reviewers: A possible flow is to pick two to three colleagues who are familiar with the code and ask them to be reviewers. Another approach, explained by Gitlab team is to have a <a href="https://about.gitlab.com/2017/03/17/demo-mastering-code-review-with-gitlab/">chained review flow</a> in which the author picks one reviewer who picks another reviewer until at least two reviewers agree with the code. Regardless of the flow you choose, <strong>avoid having too many reviewers</strong>. Being able to trust your colleagues’ code’s judgment is the key to conduct an effective and healthy code review.</p>

<h3 id="have-empathy">Have Empathy</h3>

<p>Spotting pieces of code to improve is just a part of a successful code review. Just as important is to communicate that feedback in a healthy way by showing empathy towards your colleagues.</p>

<p>Before writing a comment, remember to put yourself in the other people’s shoes. It’s easy to be misunderstood when writing, so review your own words before sending them. Even if a conversation starts being ugly, don’t let it affect you — always stay respectful. Speaking well to others is never a bad decision.</p>

<h3 id="know-how-to-compromise">Know How To Compromise</h3>

<p>When a discussion isn’t solved quickly, take it to a personal call or chat. Analyze together if it’s a subject worth paralyzing the current change request or if it can be addressed in another one.</p>

<p><strong>Be flexible but pragmatic</strong> and know how to balance efficiency (delivering) and effectiveness (quality). It’s a compromise to be made as a team. In these moments I like to think of a code review as an iteration rather than a final solution. There’s always room for improvement in the next round.</p>

<h3 id="in-person-code-reviews">In-Person Code Reviews</h3>

<p>Gathering the author and the reviewer together in a pair programming style can be highly effective. Personally, I prefer this approach when the code review involves complex changes or there’s an opportunity for a large amount of knowledge sharing. Despite this being an offline code review, it’s a good habit to leave online comments about the discussions taken, especially when changes need to be made after the meeting. This is also useful to keep other online reviewers up to date.</p>

<h3 id="learn-from-code-review-outcomes">Learn From Code Review Outcomes</h3>

<p>When a code review has suffered a lot of changes, took too long or has already had too many discussions, gather your team together and analyze the causes and which actions can be taken from it. When the code review is complex, <strong>splitting a future task into smaller tasks</strong> makes each code review easier.</p>

<p>When the experience gap is big, adopting pair programming is a strategy with incredible results — not only for knowledge sharing but also for off-line collaboration and communication. Whatever the outcome, always aim for a healthy dynamic team with clear expectations.</p>

<h2 id="as-an-author">📝 As An Author</h2>

<p>One of the main concerns when working on a code review as an author is to minimize the reviewer’s surprise when reading the code for the first time. That’s the first step to a predictable and smooth code review. Here’s how you can do it.</p>

<h3 id="establish-early-communication">Establish Early Communication</h3>

<p>It’s never a bad idea to talk with your future reviewers before coding too much. Whenever it’s an internal or external contribution, you could do a refinement together or a little bit of pair programming at the beginning of the development to discuss solutions.</p>

<p>There’s nothing wrong in asking for help as a first step. In fact, working together outside the review is a first important step to prevent early mistakes and guarantee an initial agreement. At the same time, your reviewers get aware of a future code review to be made.</p>

<h3 id="follow-the-guidelines">Follow The Guidelines</h3>

<p>When submitting a Pull Request to be reviewed, remember to add a description and to follow the guidelines. This will save the reviewers from spending time to understand the context of the new code. Even if your reviewers already know what it is about, you can also take this opportunity as a way to improve your writing and communication skills.</p>

<h3 id="be-your-first-reviewer">Be Your First Reviewer</h3>

<p>Seeing your own code in a different context allows you to find things you would miss in your code editor. Do a code review of your own code before asking your colleagues. Have a reviewer mindset and really go through every line of code.</p>

<p>Personally, <strong>I like to annotate my own code reviews</strong> to better guide my reviewers. The goal here is to prevent comments related to a possible lack of attention and making sure you followed the contribution guidelines. Aim to submit a code review just as you would like to receive one.</p>

<div class="partners__lead-place"></div>

<h3 id="be-patient">Be Patient</h3>

<p>After submitting a code review, don’t jump right into a new private message asking your reviewers to “take a look, it only takes a few minutes” and indirectly craving for that thumbs-up emoji. Trying to rush your colleagues to do their work is not a healthy mindset. Instead, <strong>trust your colleagues’ workflow</strong> as they trust you to submit a good code review. Meanwhile, wait for them to get back to you when they are available. Don’t look at your reviewers as a bottleneck. Remember to be patient because hard things take time.</p>

<h3 id="be-a-listener">Be A Listener</h3>

<p>Once a code review is submitted, comments will come, questions will be asked, and changes will be proposed. The golden rule here is to not take any feedback as a personal attack. Remember that <strong>any code can benefit from an outside perspective</strong>.</p>

<p>Don’t look at your reviewers as an enemy. Instead, take this moment to set aside your ego, accept that you make mistakes, and be open to learning from your colleagues, so that you can do a better job the next time.</p>

<h2 id="as-a-reviewer">👀 As A Reviewer</h2>

<h3 id="plan-ahead-of-your-time">Plan Ahead Of Your Time</h3>

<p>When you are asked to be a reviewer, don’t interrupt things right away. That’s a common mistake I see all the time. Reviewing code demands your full attention, and each time you switch code contexts, you are decreasing your productivity by wasting time in recalibrating your focus. Instead, plan ahead by allocating time slots of your day to do code reviews.</p>

<p>Personally, I prefer to do code reviews first thing in the morning or after lunch before picking any other of my tasks. That’s what works best for me because my brain is still fresh without a previous code context to switch off from. Besides that, once I’m done with the review, I can focus on my own tasks, while the author can reevaluate the code based on the feedback.</p>

<h3 id="be-supportive">Be Supportive</h3>

<p>When a Pull Request doesn’t follow the contribution guidelines, be supportive — especially to newcomers. Take that moment as an opportunity to guide the author to improve his/her contribution. Meanwhile, try to understand why the author didn’t follow the guidelines in the first place. <strong>Perhaps there’s room for improvement</strong> that you were not aware of before.</p>

<h3 id="check-out-the-branch-and-run-it">Check Out The Branch And Run It</h3>

<p>While reviewing the code, make it run on your own computer — especially when it involves user interfaces. This habit will help you to better understand the new code and spot things you might miss if you just used a default diff-tool in the browser which limits your review scope to the changed code (without having the full context as in your code editor).</p>

<h3 id="ask-before-assuming">Ask Before Assuming</h3>

<p>When you don’t understand something, don’t be afraid to say it and ask questions. When asking, remember to first read the surrounding code and avoid making assumptions.</p>

<p>Most of the questions fit in these two types of categories:</p>

<ol>
<li><strong>“How” Questions</strong><br />
When you don’t understand how something works or what it does, evaluate with the author if the code is clear enough. Don’t mistake simple code with ignorance. There’s a difference between code that is hard to read and code that you are not aware of. Be open to learn and use a new language feature, even if you don’t know it deeply yet. However, use it only if it simplifies the codebase.</li>
<li><strong>“Why” Questions</strong><br />
When you don’t understand the “why”, don’t be afraid of suggesting to commenting the code, especially if it’s <a href="https://twitter.com/sophiebits/status/1063180141872898048">an edge case or a bug fix</a>. The code should be self-explanatory when it comes to explaining what it does. Comments are a complement to explaining the why behind a certain approach. Explaining the context is highly valuable when it comes to maintainability and it will save someone from <a href="https://cdn-images-1.medium.com/max/1200/0*xhqIOAyiCzYl2z0G.gif">deleting a block of code that thought was useless</a>. (Personally, I like to comment on the code until I feel safe about forgetting it later.)</li>
</ol>

<h3 id="constructive-criticism">Constructive Criticism</h3>

<p>Once you find a piece of code you believe it should be improved, always remember to recognize the author’s effort in contributing to the project and express yourself in a receptive and transparent way.</p>

<ul>
<li><strong>Open discussions.</strong><br />
Avoid formalizing your feedback as a command or accusation such as “You should…” or “You forgot…”. Express your feedback as an open discussion instead of a mandatory request. Remember to comment on the code, not the author. If the comment is not about the code, then it shouldn’t belong in a code review. As said before, be supportive. Using a passive voice, talking in the plural, expressing questions or suggestions are good approaches to emphasize empathy with the author.</li>
</ul>

<blockquote>Instead of “Extract this method from here…” prefer “This method should be extracted…” or “What do you think of extracting this method…”</blockquote>

<ul>
<li><strong>Be clear.</strong><br />
A feedback can easily be misinterpreted, especially when it comes to expressing an opinion versus sharing a fact or a guideline. Always remember to clear that right away on your comment.</li>
</ul>

<blockquote>Unclear: “This code should be….”<br /><br />Opinion: “I believe this code should be…”<br /><br />Fact: “Following [our guidelines], this code should be…”.</blockquote>

<ul>
<li><strong>Explain why.</strong><br />
What’s obvious for you, might not be for others. It’s never too much explaining the motivation behind your feedback, so the author not only understands how to change something but also what’s the benefit from it.</li>
</ul>

<blockquote>Opinion: “I believe this code could be…”<br /><br />Explained: “I believe this code could be (…) because this will improve readability and simplify the unit tests.”</blockquote>

<ul>
<li><strong>Provide examples.</strong><br />
When sharing a code feature or a pattern which the author is not familiar with, complement your suggestion with a reference as guidance. When possible, go beyond MDN docs and share a snippet or a working example adapted to the current code scenario. When writing an example is too complex, <em>be supportive</em> and offer to help in person or by a video call.</li>
</ul>

<blockquote>Besides saying something such as “Using filter will help us to [motivation],” also say, “In this case, it could be something like: [snippet of code]. You can check [an example at Finder.js]. Any doubt, feel free to ping me on Slack.”</blockquote>

<ul>
<li><strong>Be reasonable.</strong><br />
If the same error is made multiple times, prefer to just leave one comment about it and remember the author to review it in the other places, too. Adding redundant comments only creates noise and might be contra-productive.</li>
</ul>

<h3 id="keep-the-focus">Keep The Focus</h3>

<p>Avoid proposing code changes unrelated to the current code. Before suggesting a change, ask yourself if it’s strictly necessary at that moment. This type of feedback is especially common in refactors. It’s one of the many trade-offs between efficiency and effectiveness that we need to make as a team.</p>

<p>When it comes to refactors, personally, I tend to prefer <strong>small but effective improvements</strong>. Those are easier to review and there’s less chance of having code conflicts when updating the branch with the target branch.</p>

<h3 id="set-expectations">Set Expectations</h3>

<p>If you leave a code review half-done, let the author know about it, so time expectations are under control. In the end, also let the author know if you agree with the new code or if you would like to re-review it once again later.</p>

<p>Before approving a code review, ask yourself if you are comfortable about the possibility of touching that code in the future. If yes, that’s a sign you did a successful code review!</p>

<h3 id="learn-to-refuse-a-code-review">Learn To Refuse A Code Review</h3>

<p>Although nobody admits it, sometimes you have to refuse a code review. The moment you decide to accept a code review but try to rush it, the project’s quality is being compromised as well as your team’s mindset.</p>

<p>When you accept to review someone’s else code, that person is trusting your capabilities — it’s a commitment. If you don’t have the time to be a reviewer, just say no to your colleague(s). I really mean it; don’t let your colleagues wait for a code review that will never be done. <strong>Remember to communicate and keep expectations clear</strong>. Be honest with your team and — even better — with yourself. Whatever your choice, do it healthily, and do it right.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Given enough time and experience, doing code reviews will teach you much more than just technical knowledge. You’ll learn to give and receive feedback from others, as well as make decisions with more thought put into it.</p>

<p>Each code review is an opportunity to grow as a community and individually. Even outside code reviews, remember to foster a healthy mindset until the day it comes naturally to you and your colleagues. Because sharing is what makes us better!</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
    <li><a title="Read 'Working Together: How Designers And Developers Can Communicate To Create Better Projects'" href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/" rel="bookmark">Working Together: How Designers And Developers Can Communicate To Create Better Projects</a></li>
    <li><a title="Read 'Better Collaboration By Bringing Designers Into The Code Review Process'" href="https://www.smashingmagazine.com/2018/07/collaboration-designers-code-review-process/" rel="bookmark">Better Collaboration By Bringing Designers Into The Code Review Process</a></li>
    <li><a title="Read 'Which Podcasts Should Web Designers And Developers Be Listening To?'" href="https://www.smashingmagazine.com/2018/04/podcasts-web-designers-developers/" rel="bookmark">Which Podcasts Should Web Designers And Developers Be Listening To?</a></li>
    <li><a title="Read 'How To Craft The Perfect Web Developer Ré­su­mé'" href="https://www.smashingmagazine.com/2018/06/web-developer-resume/" rel="bookmark">How To Craft The Perfect Web Developer Ré­su­mé</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(ra, yk, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Alvin Wan</author><title>Getting Started With Machine Learning</title><link>https://www.smashingmagazine.com/2018/09/getting-started-with-machine-learning/</link><pubDate>Fri, 07 Sep 2018 12:00:26 +0000</pubDate><guid>https://www.smashingmagazine.com/2018/09/getting-started-with-machine-learning/</guid><description>What are the fundamentals of machine learning, and what are the necessary tools to evaluate risk and other concerns in a machine learning application? The goal of machine learning is to find patterns in data and use those patterns to make predictions. In this article, Alvin Wan will cover everything you need to get started. By the end, you should have an understanding of how to advance your practice and study of machine learning. Let’s begin!</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2018/09/getting-started-with-machine-learning/" />
              <title>Getting Started With Machine Learning</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Getting Started With Machine Learning</h1>
                  
                    
                    <address>Alvin Wan</address>
                  
                  <time datetime="2018-09-07T12:00:26&#43;00:00" class="op-published">2018-09-07T12:00:26+00:00</time>
                  <time datetime="2018-09-07T12:00:26&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>The goal of machine learning is to find patterns in data and use those patterns to make predictions. It can also give us a framework to discuss machine learning problems and solutions — as you’ll see in this article.</p>

<p>First, we will start with definitions and applications for machine learning. Then, we will discuss abstractions in machine learning and use that to frame our discussion: data, models, optimization models, and optimization algorithms. Later on in the article, we will discuss fundamental topics that underlie all machine learning methods and conclude with practical guidance for getting started with using machine learning. By the end, you should have an understanding of how to advance your practice and study of machine learning.</p>

<p>Let’s begin.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><strong>Web forms</strong> are at the center of every meaningful interaction. Meet Adam Silver&rsquo;s <strong><a href="https://www.smashingmagazine.com/printed-books/form-design-patterns/">Form Design Patterns</a></strong>, a practical guide to <strong>designing and building forms</strong> for the web.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/64e57b41-b7f1-4ae3-886a-806cce580ef9/form-design-patterns-shop-image-1-1.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/51e0f837-d85d-4b28-bfab-1c9a47f0ce33/form-design-patterns-shop-image.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="so-what-exactly-is-machine-learning">So, What Exactly Is Machine Learning?</h2>

<p>Machine learning is generically a set of techniques to find patterns in data. Applications range from self-driving cars to personal AI assistants, from translating between French and Taiwanese to translating between voice and text. There are a few common applications of machine learning that already or could potentially permeate your day-to-day.</p>

<ol>
<li><strong>Detecting anomalies</strong><br />
Recognize spikes in website traffic or highlight abnormal bank activity.</li>
<li><strong>Recommend similar content</strong><br />
Find products you may be looking for or even Smashing Magazine articles that are relevant.</li>
<li><strong>Predict the future</strong><br />
Plan the path of neighboring vehicles or identify and extrapolate market trends for stocks.</li>
</ol>

<p>The above are few of many applications of machine learning, but most applications tie back to learning the underlying <em>distribution</em> of data. A distribution specifies events and probability of each event. For example:</p>

<ul>
<li>With 50% probability, you buy an item $5 or less.</li>
<li>With 25% probability, you buy an item $5-$10.</li>
<li>With 24% probability, you buy an item $10-100.</li>
<li>With 1% probability, you buy an item &gt; $100.</li>
</ul>

<p>Using this distribution, we can accomplish all of our tasks above:</p>

<ol>
<li><strong>Detecting anomalies</strong><br />
With a $100 purchase, we can confidently call this an anomaly.</li>
<li><strong>Recommend similar content</strong><br />
A purchase of $3 means we should recommend more items $5 or less.</li>
<li><strong>Predict the future</strong><br />
Without any prior information, we can predict that the next purchase will be $5 or less.</li>
</ol>

<p>With a distribution of data, we can accomplish a myriad of tasks. In sum, one goal in machine learning is to learn this distribution.</p>

<p>Even more generically, our goal is to learn a specific function with particular inputs and outputs. We call this function our <em>model</em>. Our input is denoted <code>x</code>. Say our model, which accepts input <code>x</code>, is</p>

<pre><code class="language-javascript">f(x) = ax
</code></pre>

<p>Here, <code>a</code> is a <em>parameter</em> of our model. Each parameter corresponds to a different instance of our model. In other words, the model where <code>a=2</code> is different from the model where <code>a=3</code>. In machine learning, our goal is to learn this parameter, changing it until we do “well.” How do we determine which values of <code>a</code> do “well”?</p>

<p>We need to define a way to evaluate our model, for each parameter <code>a</code>. To start, the output of <code>f(x)</code> is our <em>prediction</em>. We will refer to <code>y</code> as our <em>label</em>, meaning the true and desired output. With our predictions and our labels, we can define a <em>loss</em> function. One such loss function is simply the difference between our prediction and our label, <code>|f(x) - y|</code>. Using this loss function, we can then evaluate different parameters for our model. Picking the best parameter for our model is known as <em>training</em>. If we have a few possible parameters, we can simply try each parameter and pick the one with the smallest loss!</p>

<p>However, most problems are not as simple. <strong>What happens if there are an infinite number of different parameters?</strong> Let’s say all decimal values between 0 and 1? Between 0 and infinity? This brings us to our next topic: abstractions in machine learning. We will discuss different facets of machine learning, to compartmentalize your knowledge into data, models, objectives, and methods of solving objectives. Beyond learning the right parameter, there are plenty of other challenges: how do we break down a problem as complex as controlling a robot? How do we control a self-driving car? What does it mean to train a model that identifies faces? The section below will help you organize answers to these questions.</p>

<h2 id="abstractions">Abstractions</h2>

<p>There are countless topics in machine learning — at various levels of specificity. To better understand where each piece fits in the larger picture, consider the following abstractions for machine learning. These abstractions compartmentalize our discussion of machine learning topics, and knowing them will make it easier for you to frame topics. The following classifications are taken from Professor Jonathan Shewchuck at UC Berkeley:</p>

<ol>
    <li><strong>Application and Data</strong><br />Consider the possible inputs and the desired output for the problem.<br /><blockquote><strong>Questions</strong>: What is your goal? How is your data structured? Are there labels? Is it reasonable for us to extract output from the provided inputs?<br /><br /><strong>Example</strong>: The goal is to classify pictures of handwritten digits. The input is an image of a handwritten number. The output is a number.</blockquote><br /></li>
    <li><strong>Model</strong><br />Determine the class of functions under consideration.<br /><blockquote><strong>Questions</strong>: Are linear functions sufficient? Quadratic functions? Polynomials? What types of patterns are we interested in? Are neural networks appropriate? Logistic regression?<br /><br /><strong>Example</strong>: Linear regression</blockquote><br /></li>
    <li><strong>Optimization Problem</strong><br />Formulate a concrete objective in mathematics.<br /><blockquote><strong>Questions</strong>: How do we define loss? How do we define success? Should we apply additionally penalties to bias our algorithm? Are there imbalances in the data our objective needs to consider?<br /><br /><strong>Example</strong>: Find `x` that minimizes <code>&#124;Ax-b&#124;^2</code></blockquote><br /></li>
    <li><strong>Optimization Algorithm</strong><br />Determine how you will solve the optimization problem.<br /><blockquote><strong>Questions</strong>: Can we compute a solution by hand? Do we need an iterative algorithm? Can we convert this problem to an equivalent but easier-to-solve objective, and solve that one?<br /><br /><strong>Example</strong>: Take derivative of the function. Set it to zero. Solve for our optimal parameter.</blockquote><br /></li>
</ol>

<h3 id="abstraction-1-data">Abstraction 1: Data</h3>

<p>In practice, collecting, managing, and packaging data is 90% of the battle. The data contains <em>samples</em> in which each sample is a specific realization of our input. For example, our <em>input</em> may generically be images of dogs. The first <em>sample</em> is specifically a picture of Maxie, my Bernese Mountain dog-chow chow mix at home. The second sample is specifically a picture of Charlie, a young corgi.</p>

<p>While training your model, it is important to handle your data properly. This means separating our data accordingly and not peeking prematurely at any set of data. In general, our data is split into three portions:</p>

<ol>
<li><strong>Training set</strong><br />
This is the dataset you train your model on. The model may see this set hundreds of times.</li>
<li><strong>Validation set</strong><br />
This is the dataset you evaluate your model on, to assess accuracy and tune your model or method accordingly.</li>
<li><strong>Test set</strong><br />
This is the dataset you evaluate on to assess accuracy, once at the very end. Running on the test set prematurely could mean your model overfits to the test set as well, so run only once. We will discuss the notion of “overfitting” in more detail below.</li>
</ol>

<h3 id="abstraction-2-models">Abstraction 2: Models</h3>

<p>Machine learning methods are split into the following two:</p>

<h4 id="supervised-learning">Supervised Learning</h4>

<p>In supervised learning, our algorithm has access to labeled data. Still, we explore the following two classes of problems:</p>

<ul>
  <li><strong>Classification</strong><br />Determine which of <code>k</code> classes <code>{C_1, C_2, ... C_k}</code> to which each sample belongs, e.g. “Which breed of dog is this?” The dog could be one of <code>{"corgi", "bernese mountain dog", "chow chow"...}</code></li>
  <li><strong>Regression</strong><br />Determine a real-valued output (which are often probabilities), e.g. “What is the probability this patient has neuroblastoma (eye cancer)?”</li>
</ul>

<h4 id="unsupervised-learning">Unsupervised Learning</h4>

<p>In unsupervised learning, our algorithm does not have access to labels, and we explore the following classes of problems:</p>

<ul>
  <li><strong>Clustering</strong><br />Cluster samples into <code>k</code> clusters. We do not have a label for the resulting clusters. “Which DNA sequences are most similar?”</li>
  <li><strong>Dimensionality reduction</strong><br />Reduce the number of “unique” (linearly independent) features we consider. “What are common features of faces?”</li>
</ul>

<h3 id="abstraction-3-optimization-objective">Abstraction 3: Optimization Objective</h3>

<p>Before discussing optimization objectives and algorithms, we&rsquo;ll need an example to discuss. Least squares are the canonical example. We will restrict our attention to a specific form of least squares: Let us return to our grade-school problem of fitting a line to some points.</p>

<p>Let’s recall the equation of a line:</p>

<pre><code class="language-javascript">y = m * x + b
</code></pre>

<p>Assume we have such a line. This is the true underlying model.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png"
			
			sizes="100vw"
			alt=" true model"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      True model. The line that generates our data. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6680e9a9-e6f1-4853-bb47-7bf384f6e366/1-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Now, sample points from this line.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png"
			
			sizes="100vw"
			alt="true data"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      True data. Data that is sampled from the true model. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c15add57-28c5-4e12-9b9a-24c254f0ff0e/2-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>For each point, jiggle it a little bit. In other words, add <em>noise</em>, which is random perturbations. This noise is due to real-world processes.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png"
			
			sizes="100vw"
			alt="noise"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Noise. Real-world perturbations that affect our data. This may be due to imprecision in measurements, lossy compression, and so on. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f48c8c95-f505-4300-bd27-89ae9f087078/3-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This gives us our <em>observed data</em>. We will call these points <code>(x_1, y_1), (x_2, y_2), (x_3, y_3)...</code>. This is the training data we are given to train a model on. We do not have access to the underlying line that generated this data (the original green line).</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png"
			
			sizes="100vw"
			alt="observations"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Observations. Our true data with noise and ultimately what we will use to train a model. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5b1e254b-93c3-4158-86ea-a5876de90992/4-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Say we have an estimate for the <em>parameters</em> of a line. In this case, the parameters are <code>m</code> and <code>b</code>. This gives us a predicted line, drawn in blue below.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png"
			
			sizes="100vw"
			alt="proposed model"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Proposed model. The result of training a model on our observations. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dd8499fa-ebeb-4c3b-b30b-c61c2a380aa6/5-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>We wish to evaluate our blue line, to see how accurate it is. To start, we use <code>m</code> and <code>b</code> to estimate <code>y</code>. We compute a set of <code>ŷ</code> values.</p>

<pre><code class="language-javascript">ŷ_i = m * x_i + b
</code></pre>

<p>The error for a single predicted <code>ŷ_i</code> and true <code>y_i</code> is simply</p>

<pre><code class="language-javascript">(ŷ_i−y_i)^2
</code></pre>

<p>Our total error is then the sum of squared differences, across all samples. This yields our loss.</p>

<pre><code class="language-javascript">∑(ŷ_i−y_i)^2
</code></pre>

<p>Presented visually, this is the vertical distance between our observed points and our predicted line.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png"
			
			sizes="100vw"
			alt="observed error"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Observed error. The distance between our observed data and our proposed model. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2ba7e3c-e380-48d0-96a9-117d8886eab4/6-getting-started-with-ml.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Plugging in <code>ŷ_i</code> from above, we then have the total error in terms of <code>m</code> and <code>b</code>.</p>

<pre><code class="language-javascript">∑(m * x_i + b − y_i)^2
</code></pre>

<p>Finally, we want to minimize this quantity. This yields our <strong>objective function</strong>, abstraction 3 from our list of abstractions above.</p>

<pre><code class="language-javascript">min_{m, b} ∑(m * x_i + b−y_i)^2
</code></pre>

<p>The above states in mathematics that the goal is to minimize the loss by changing values of <code>m</code> and <code>b</code>. The purpose of this section was to motivate fitting a line of best of fit, a special case of <em>least squares</em>. Additionally, we showed examined the <em>least squares objective</em>. Next, we need to solve this objective.</p>

<div class="partners__lead-place"></div>

<h3 id="abstraction-4-optimization-algorithm">Abstraction 4: Optimization Algorithm</h3>

<p>How do we minimize this? We take the derivative with respect to <code>m</code>`, set to 0 and solve. After solving, we obtain the analytical solution. Solving for an analytical solution was our <strong>optimization algorithm</strong>, the fourth and final abstraction in our list of abstractions.</p>

<p><strong>Note</strong>: <em>The important portion of this section is to inform you that least squares have a closed form solution, meaning that the optimal solution for our problem can be computed, explicitly. To understand why this is significant, we need to examine a problem without a closed-form solution. For example, we could never solve <code>x=logx</code> for a standard base-10 logarithm. Try graphing these two lines, and we see that they never intersect. In which case, we have no closed-form solution. On the other hand, ordinary least squares have a closed-form — which is good news. For any problem reduced to least squares, we can then compute the optimal solution, given our data and assumptions.</em></p>

<h2 id="fundamental-topics">Fundamental Topics</h2>

<p>Before studying more methods, it is necessary to understand the undercurrents of machine learning. These will govern the initial study of machine learning:</p>

<h3 id="bias-variance-tradeoffs">Bias-Variance Tradeoffs</h3>

<p>One of machine learning’s most dreaded evils is <em>overfitting</em> in which a model is too closely tailored to the training data. In the limit, the most overfit model will memorize the data. This might mean that if one does well on exam A, one repeats every detail for exam B — down to the duration of an inter-exam restroom trip and whether or not one used the urinal.</p>

<p>A related but less common evil is <em>underfitting</em>, where the model is not sufficiently expressive to capture important information in the data. This could mean that one looks only at homework scores to predict exam scores, ignoring the effects of reading notes, completing practice exams, and more. Our goal is to build a model that generalizes to new examples while making the appropriate distinctions.</p>

<p>Given these two evils, there are a variety of approaches to fighting both. One is modifying your optimization objective to include a term that penalizes model complexity. Another is tuning <em>hyperparameters</em> that govern either your objective or your algorithm, which may correspond to notions such as “training speed” or “momentum.” The bias-variance tradeoff gives us a precise way of defining and handling both overfitting and underfitting.</p>

<h3 id="maximum-likelihood-estimation-mle-maximum-a-posteriori-map">Maximum Likelihood Estimation (MLE) + Maximum A Posteriori (MAP)</h3>

<p>Say we have ice cream flavors A, B, and C. We observe different recipes. Our goal is to predict which flavor each recipe produces.</p>

<p>One way to predict flavors based on recipes is to first estimate the following probability:</p>

<pre><code class="language-javascript">P(flavor&#124;recipe)
</code></pre>

<p>Given this probability and a new recipe, how can we predict the flavor? Given a recipe, simply consider the probability of each of the flavors A, B, C.</p>

<pre><code class="language-javascript">P(flavor=A&#124;recipe) = 0.4
P(flavor=B&#124;recipe) = 0.5
P(flavor=C&#124;recipe) = 0.1
</code></pre>

<p>Then, pick the flavor that has the highest probability. Above, flavor B has the highest probability, given our recipe. Thus, we predict flavor B. Restating the above rule in mathematics, we have:</p>

<div class="break-out">

<pre><code class="language-javascript">argmax_{flavor} P(flavor&#124;recipe)  # argmax means take the flavor that corresponds to the max value
</code></pre></div>

<p>However, the only information at our disposal is the reverse: the probability of some recipe given the flavor.</p>

<pre><code class="language-javascript">P(recipe&#124;flavor)
</code></pre>

<p>For Maximum Likelihood Estimates, we make assumptions and find that the two values are proportional.</p>

<pre><code class="language-javascript">P(recipe&#124;flavor) ~ P(flavor&#124;recipe)
</code></pre>

<p>Since we’re only interested in the class with maximum probability <code>P(flavor|recipe)</code>, we can simply find the class with maximum probability, for a proportional value <code>P(recipe|flavor)</code>.</p>

<pre><code class="language-javascript">argmax_{flavor} P(recipe&#124;flavor)
</code></pre>

<p>MLE offers the above objective as one way to predict, using the probability of data given the labels.</p>

<p>However, allow me to convince you that it&rsquo;s reasonable to assume we have <code>(x|y)</code>. We can estimate this from observed, real-world data. For example, say we wish to estimate the number of marbles each student in your class carries, based on the number of rubber ducks the student carries.</p>

<p>Each student&rsquo;s number of rubber ducks is the data <code>x</code>, and the number of marbles she or he has is y. We will use this sample data below.</p>

<pre><code class="language-javascript">&#124; x &#124; y &#124;
&#124;---&#124;---&#124;
&#124; 1 &#124; 2 &#124;
&#124; 1 &#124; 1 &#124;
&#124; 1 &#124; 2 &#124;
&#124; 2 &#124; 1 &#124;
&#124; 2 &#124; 2 &#124;
&#124; 1 &#124; 2 &#124;
</code></pre>

<p>For every <code>y</code>, we can compute the number of <code>x</code>, given us <code>P(x|y)</code>. For the first one, <code>P(x=1|y=1)</code>, consider all of the rows where <code>y=1</code>. There are 2, and only one of them has <code>x=1</code>. Therefore, <code>P(x=1|y=1) = <sup>1</sup>&frasl;<sub>2</sub></code>. We can repeat this for all values of <code>x</code> and <code>y</code>.</p>

<pre><code class="language-javascript">P(x=1&#124;y=1) = 1/2
P(x=2&#124;y=1) = 1/2
P(x=1&#124;y=2) = 3/4
P(x=2&#124;y=2) = 1/4
</code></pre>

<h3 id="featurizations-regularization">Featurizations, Regularization</h3>

<p>Least squares draw lines of best fit for us. Note that least squares can fit the model anytime the model is linear in its inputs <code>x</code> and outputs <code>y</code>.</p>

<p>Say <code>m=1</code>. We have the following equation:</p>

<pre><code class="language-javascript">y = x + b
</code></pre>

<p>However, what if we had data that doesn&rsquo;t generally follow a line? Specifically, consider a set of data sampled along a circle. Recall that the equation for a circle is:</p>

<pre><code class="language-javascript">x^2 + y^2 = r^2
</code></pre>

<p>Can least squares fit this well? As it stands, no. The model is <em>not</em> linear in its inputs <code>x</code> and outputs <code>y</code>. Instead, the model above is <em>quadratic</em> in <code>x</code> and <code>y</code>. However, it turns out that we can use <em>still</em> use least squares, just with a modification. To accomplish this, <strong>we featurize our samples</strong>.</p>

<p>Consider the following: what if the input to our model was <code>x_ = x^2</code> and <code>y_ = y^2</code>? Then, our model is trying to learn the following model.</p>

<pre><code class="language-javascript">x_ + y_ = r^2
</code></pre>

<p>Is this linear in the model&rsquo;s input <code>x_</code> and output <code>y_</code>? Yes. Note the subtlety. The current model is still quadratic in <code>x</code>,<code>y</code> but it is linear in <code>x_</code>,<code>y_</code>. This means that least squares can fit the data if we square <code>x^2</code> and <code>y^2</code> before training least squares.</p>

<p>More generally, we can take any non-linear featurization to apply least squares to labels that are non-linear in the features. This is a fairly powerful tool, known as <em>featurization</em>.</p>

<p>However, featurizations lead to more complex models. Regularization allows us to penalize model complexity, ensuring that we do not overfit the training data.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In this article, you&rsquo;ve touched on major topics in the fundamentals of machine learning. Using the abstractions above, you now have a framework to discuss machine learning problems and solutions. Using the fundamental topics above, you now also have quintessential concepts to learn more about, giving you the necessary tools to evaluate risk and other concerns in a machine learning application.</p>

<h3 id="other-resources">Other Resources</h3>

<p>We will continue to explore these topics in depth, both the undercurrents of machine learning and specific methods. In the interim, here are resources to further your study and exploration of machine learning:</p>

<ul>
<li>“<a href="https://eecs189.org">Introduction to Machine Learning</a>,” Machine Learning course CS189, UC Berkeley</li>
<li><a href="https://numpy.org">NumPy</a> (for efficient linear algebra utilities)</li>
<li><a href="https://scikit-learn.org">scikit-learn</a> (for out-of-the-box machine learning methods)</li>
</ul>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/">The Impact Of Agile Methodologies On Code Quality</a></li>
<li><a href="https://www.smashingmagazine.com/2024/03/uniting-rikyu-wisdom-brand-experience-principles/">Crafting Experiences: Uniting Rikyu’s Wisdom With Brand Experience Principles</a></li>
<li><a href="https://www.smashingmagazine.com/2019/01/powerful-image-analysis-google-cloud-vision-python/">Powerful Image Analysis With Google Cloud Vision And Python</a></li>
<li><a href="https://www.smashingmagazine.com/2023/08/friction-feature-machine-learning-algorithms/">Using Friction As A Feature In Machine Learning Algorithms</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(ra, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Ida Aalen</author><title>Better Collaboration By Bringing Designers Into The Code Review Process</title><link>https://www.smashingmagazine.com/2018/07/collaboration-designers-code-review-process/</link><pubDate>Tue, 10 Jul 2018 11:50:26 +0000</pubDate><guid>https://www.smashingmagazine.com/2018/07/collaboration-designers-code-review-process/</guid><description>Involving other people early on — especially people from other disciplines — can feel scary. By taking inspiration from code reviews, we can improve collaboration both within our own fields as well as across disciplines, be it design, UX, content or development. No one is really promoting waterfall processes anymore. So how can you involve people early on so that you’re avoiding the waterfall, but also making sure that you’re not setting yourself up for design by committee? Ida Aalen found her answer when learning about code reviews.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2018/07/collaboration-designers-code-review-process/" />
              <title>Better Collaboration By Bringing Designers Into The Code Review Process</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Better Collaboration By Bringing Designers Into The Code Review Process</h1>
                  
                    
                    <address>Ida Aalen</address>
                  
                  <time datetime="2018-07-10T11:50:26&#43;00:00" class="op-published">2018-07-10T11:50:26+00:00</time>
                  <time datetime="2018-07-10T11:50:26&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>Smooth collaboration between developers and designers is something everyone aspires to, but it’s <a href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/">notoriously difficult</a>. But with today’s advanced web, it's difficult &mdash; if not impossible &mdash; to build a truly great product without collaborating across disciplines. Because of the range of technologies required to build a product, the product can only truly succeed when all disciplines &mdash; developers <em>and</em> designers, content creators, and user experience strategists &mdash; are deeply involved from the early stages of the project. When this happens, all ends of what it takes to build a product come naturally together into a unified whole, and a thus great product.</p>

<p>Because of this, no one is really promoting <a href="https://en.wikipedia.org/wiki/Waterfall_model">waterfall processes</a> anymore. Nevertheless, involving other people early on, especially people from other disciplines, can feel scary. In the worst case scenario, it leads to “<a href="https://en.wikipedia.org/wiki/Design_by_committee">design by committee</a>.”</p>

<p>Moreover, both designers and content strategists often have backgrounds in fields in which a sole creative genius is still the ideal. Having someone else proof your work can feel like a threat to your creativity.</p>

<p>So how can you involve people early on so that you’re avoiding the waterfall, but also making sure that you’re not setting yourself up for design by committee? I found my answer when learning about code reviews.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Roll up your sleeves and <strong>boost your UX skills</strong>! Meet <strong><a data-instant href="https://smart-interface-design-patterns.com/">Smart Interface Design Patterns</a></strong>&nbsp;🍣, a 10h video library by Vitaly Friedman. <strong>100s of real-life examples</strong> and live UX training. <a href="https://www.youtube.com/watch?v=3mwZztmGgbE">Free preview</a>.</p>
<a data-instant href="https://smart-interface-design-patterns.com/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://smart-interface-design-patterns.com/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3155f571-450d-42f9-81b4-494aa9b52841/video-course-smart-interface-design-patterns-vitaly-friedman.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8c98e7f9-8e62-4c43-b833-fc6bf9fea0a9/video-course-smart-interface-design-patterns-vitaly-friedman.jpg"
    alt="Feature Panel"
    width="690"
    height="790"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="the-em-aha-em-moment">The <em>Aha!</em> Moment</h2>

<p>In July 2017, I founded <a href="https://confrere.com">Confrere</a> together with two developers, and we quickly hired our first engineer (I’m not a developer myself, I’m more of a UX or content designer). Our collaboration was running surprisingly smoothly,  so much so that at our <a href="https://www.atlassian.com/team-playbook/plays/retrospective">retrospectives</a>, the recurring theme was that we all felt that we were “doing it right.”</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg"
			
			sizes="100vw"
			alt="Three people are smiling and sitting next to each other around a computer. From left to right, they are Dag-Inge (CTO), Ida (CPO) and Ingvild (Sr. Engineer)."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Dag-Inge (CTO), myself (CPO) and Ingvild (Sr. Engineer). (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/50e9277c-279f-47c5-9565-53800ee25c30/00-the-team.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>I sat down with my colleagues to try to pinpoint what exactly it was that we were “doing right” so that we could try to preserve that feeling even as our company grew and our team expanded. We came to the realization that we all appreciated that the whole team was involved early on and that we were being honest and clear in our feedback to each other. Our CTO Dag-Inge added: “It works because we’re doing it as peers. You’re not being berated and just getting a list of faults”.</p>

<p>The word “peer” is what gave me the aha moment. I realized that those of us working within UX, design, and content have a lot to learn from developers when it comes to collaboration.</p>

<p>Peer reviewing in the form of code reviews is essential to how software gets built. To me, code reviews offer inspiration for improving collaboration within our own fields, but also a model for collaborating across fields and disciplines.</p>

<p>If you’re already familiar with code reviews, feel free to skip the next section.</p>

<h2 id="what-is-a-code-review">What Is A Code Review?</h2>

<p>A code review can be done in various ways. Today, the most typical form of code review happens in the way of so-called <a href="https://www.atlassian.com/git/tutorials/making-a-pull-request">pull requests</a> (using a technology called <a href="https://www.atlassian.com/git/tutorials/what-is-git">git</a>). As illustrated below, the pull requests let other people on the team know that a developer has completed code that they wish to merge with the main code base. It also allows the team to review the code: they give feedback on the code before it gets merged, in case it needs improvement.</p>

<p>Pull requests have clearly defined roles: there is an author and a reviewer(s).</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg"
			
			sizes="100vw"
			alt="Ingvild and Dag-Inge is setting next to each other and smiling. An arrow indicated that Ingvild has sent code to Dag-Inge."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Ingvild (the author) requests a review from Dag-Inge (the reviewer). (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/354b8724-8a3f-4f0f-83fe-ff3c093360fe/01-code-review-01.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>As an example, let’s say our senior engineer Ingvild has made a change to Confrere’s sign-up flow. Before it is merged into the main code base and gets shipped, she (the author) creates a pull request to request a review from our CTO Dag-Inge (the reviewer). He won’t make any changes to her code, only add his comments.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg"
			
			sizes="100vw"
			alt="Ingvild and Dag-Inge is setting next to each other. An arrow indicates that Dag-Inge has sent comments on code back to Ingvild."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Dag-Inge comments on Ingvild’s code. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b30af716-c158-44a1-93d3-3eb1101dd13d/02-code-review-02.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>It’s up to Ingvild how she wants to act on the feedback she received in the review. She’ll update her pull request with the changes she sees fit.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg"
			
			sizes="100vw"
			alt="Ingvild and Dag-Inge are sitting next to each other. An arrow indicates that Ingvild is sending back her code to Dag-Inge, having looked through the code he commented on."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Ingvild updates her code with the changes she sees fit in light of Dag-Inge’s comments. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4311ee16-a41d-4dd6-bf32-0555f7c6262e/03-code-review-03.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>When the reviewer(s) approve the pull request, Ingvild can then merge her changes with the main code base.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg"
			
			sizes="100vw"
			alt="Ingvild and Dag-Inge are sitting next to each other. A thumbs-up is displayed on the code review Dag-Inge has sent to Ingvild. And arrow indicates she pushes this code to the main repository."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      After Dag-Inge gives the thumbs up, Ingvild can push the fix to production. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9dd649db-9e2b-4d64-8388-2c4b862c053f/04-code-review-04.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="why-bother-doing-code-review">Why Bother Doing Code Review?</h2>

<p>If you’ve never done code review, the process above might sound bureaucratic. If you have doubts, here’s a <a href="https://www.atlassian.com/agile/software-development/code-reviews">ton</a> <a href="https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs/">of</a> <a href="https://medium.com/@palantir/code-review-best-practices-19e02780015f">blog</a> <a href="https://mtlynch.io/human-code-reviews-1/">posts</a> and <a href="https://kev.inburke.com/docs/shull_defects.pdf">academic research</a> about the advantages of code review.</p>

<blockquote>"Code reviews set the tone for the entire company that everything we do should be open to scrutiny from others, and that such scrutiny should be a welcome part of your workflow rather than viewed as threatening.<br /><br />&mdash; <a href="https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs/">Bruce Johnson, co-founder of Full Story</a>"</blockquote>

<p>Code review reduces risk. Having someone proof your work, and also <em>knowing</em> someone will proof your work, helps weed out errors and heightens quality. In addition, it ensures consistency and helps every team member familiarize with more of the code base.</p>

<p>When done right, code review also builds a culture for collaboration and openness. Trying to understand and critique other people’s work is an excellent way to learn, and so is getting honest feedback on your work.</p>

<p>Always having at least two people look over the code also curtails ideas of “my” code and “your” code. It’s <em>our</em> code.</p>

<p>Considering these advantages, a review shouldn’t just be for code.</p>

<h2 id="review-principles-for-all-disciplines-not-just-code">Review Principles For All Disciplines, Not Just Code</h2>

<p>With reviews, there is always one author and one or more reviewers. That means you can involve people early on without falling into design by committee.</p>

<p>First, I have to mention two important factors which will affect your team’s ability to do beneficial reviews. You don’t necessarily have to have mastered them, but as a minimum, you should aspire to the following:</p>

<ul>
<li>You and your colleagues <a href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/#respect">respect each other</a> and each other’s disciplines.</li>
<li>You’re sufficiently self-assured in your own role so that you feel like you can both give and receive criticism (this is also connected to the team’s <a href="https://www.nytimes.com/2016/02/28/magazine/what-google-learned-from-its-quest-to-build-the-perfect-team.html">psychological safety</a>).</li>
</ul>

<p>Even if we’re not reviewing code, there’s a lot to learn from existing <a href="https://medium.com/@palantir/code-review-best-practices-19e02780015f">best practices</a> for code reviews.</p>

<p>Within our team, we try to adhere to the following principles when doing reviews:</p>

<ol>
<li>Critique the work, not the author.</li>
<li>Be critical, but remain affable and curious.</li>
<li>Differentiate between a) Suggestions b) Requirements, c) Points that need discussion or clarification.</li>
<li>Move discussions from text to face-to-face. (<a href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/#creating-working-relationships">Video counts</a>)</li>
<li>Don’t forget to praise the good parts! What’s clever, creative, solid, original, funny, nice, and so on?</li>
</ol>

<p>These <a href="https://confrere.com/about/how-we-work/collaboration">principles</a> weren’t actually written down until <em>after</em> we discussed why our collaboration was working so well. We all felt we were allowed to and expected to ask questions and suggest improvements already, and that our motivations were always about building something great together, and not about criticising another person.</p>

<p>Because we were being clear about what kind of feedback we were giving, and also remembered to praise each other’s good work, doing reviews was a positive force rather than a demotivating one.</p>

<h2 id="an-example">An Example</h2>

<p>To give you an idea of how our team uses review across disciplines and throughout a process, let’s look at how the different members of our team switched between the roles of author and reviewer when we created our sign-up flow.</p>

<div class="partners__lead-place"></div>

<h3 id="step-1-requirements-gathering">Step 1: Requirements Gathering</h3>

<p><strong>Author:</strong> Ida (UX)</p>

<p><strong>Reviewers:</strong> Svein (strategy), Dag-Inge (engineering), Ingvild (engineering).</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg"
			
			sizes="100vw"
			alt="A whiteboard is showing rough sketches of a sign-up form. A man (Svein) and a woman (Ingvild) are smiling and discussing."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The team gathered around the whiteboard. Svein (CEO) to the left, Ingvild (Sr. Eng), to the right. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c4b47537-2a48-4d59-8b2f-64e0485a3c58/05-requirements-gathering.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Whiteboard sessions can be exhausting if there’s no structure to them. To maintain productivity and creativity, we use the author/reviewer structure, even for something as seemingly basic as brainstorming on a whiteboard. In this case, in which we were coming up with the requirements for our sign-up flow, I got to be the author, and the rest of the team gave their feedback and acted as reviewers. Because they also knew they’d be able to review what I came up with in step 2 (plenty more opportunity for adjustments, suggestions, and improvements), we worked swiftly and were able to agree upon the requirements in under 2 hours.</p>

<h3 id="step-2-mockup-with-microcopy">Step 2: Mockup With Microcopy</h3>

<p><strong>Author:</strong> Ida (UX)</p>

<p><strong>Reviewers:</strong> Ingvild (engineering), Eivind (design), Svein (strategy).</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png"
			
			sizes="100vw"
			alt="A screenshot of a Google Doc mocking up a sign-up form with comments from team members Ingvild and Ida."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      By mocking up in Google docs, it’s easy for people from all disciplines to provide feedback early on. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9ed5ed76-7ce6-4d5b-a2fb-6cc9309bb3c2/06-mocup-with-microcopy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>As an author, I created a mockup of the sign-up flow with microcopy. Did the sign-up flow make sense, from both the user and engineering perspective? And how could we improve the flow from a design and frontend perspective? At this stage, it was essential to work in a format in which  it would be easy for all disciplines to give feedback (we opted for Google Docs, but it could also have been done with a tool like InvisionApp).</p>

<h3 id="step-3-implementing-the-sign-up-flow">Step 3: Implementing The Sign-Up Flow</h3>

<p><strong>Author:</strong> Ingvild (engineering)</p>

<p><strong>Reviewer:</strong> Ida (UX) and Dag-Inge (engineering).</p>

<p>We had agreed upon the flow, the input fields, and the microcopy, and so it was up to Ingvild to implement it. Thanks to <a href="https://surge.sh/">Surge</a>, we can automatically create preview URLs of the changes so that people who can’t read code are able to give feedback at this stage as well.</p>

<h3 id="step-4-user-testing">Step 4: User Testing</h3>

<p><strong>Author:</strong> Ida (UX)</p>

<p><strong>Reviewer:</strong> The users.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg"
			
			sizes="100vw"
			alt="Two women (Ida and a user) sitting next to eachother in front of a laptop."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Ida doing user testing on a small budget. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cdaaea55-cc0a-4930-80f7-af953d4b7316/07-user-testing.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Yes, we consider user testing a form of review. We brought our newly built sign-up flow face-to-face with actual users. This step gave us a ton of insight, and the most significant changes in our sign-up flow came as a result.</p>

<h3 id="step-5-design">Step 5: Design</h3>

<p><strong>Author:</strong> Eivind (design)</p>

<p><strong>Reviewers:</strong> Ingvild (engineering) and Ida (UX).</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png"
			
			sizes="100vw"
			alt="A screenshot from Slack. Eivind, the designer, has posted a screenshot, and Ida replies with enthusiasm."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The first version of the sign-up flow was based on existing design components. In this stage, Eivind developed some new components to help improve the design. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f66371e6-9301-4f66-8d3f-4543e51c8db3/08-design.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>When design suddenly shows up here in step 5, it might look a lot like a waterfall process. However, our designer Eivind had already been involved as a reviewer since step 2. He gave a bunch of useful feedback at that stage and was also able to start thinking about how we could improve the design of the sign-up flow beyond the existing modules in our design system. At this step, Eivind could also help solve some of the issues that we identified in the user testing.</p>

<h3 id="step-6-implementation">Step 6: Implementation</h3>

<p><strong>Author:</strong> Ingvild (engineering)</p>

<p><strong>Reviewer:</strong> Eivind (design), Ida (UX) and Dag-Inge (engineering).</p>

<p>And then we’re back to implementing.</p>

<h4 id="why-review-works">Why Review Works</h4>

<p>In summary, there’s always just one author, thus avoiding design by committee. By involving a range of disciplines as reviewers early on, we avoid having a waterfall process.</p>

<p>People can flag their concerns early and also start thinking about how they can contribute later on. The clearly defined roles keep the process on track.</p>

<h2 id="regular-review-walkthroughs">Regular Review Walkthroughs</h2>

<p>Taking inspiration from code walkthroughs, we also do regular review walkthroughs with different foci, guided by the following principles:</p>

<ul>
<li>The walkthrough is done <strong>together.</strong></li>
<li><strong>One person</strong> is in charge of reviewing and documenting.</li>
<li>The idea is to <strong>identify issues</strong>, not necessarily to solve them.</li>
<li>Choose a <strong>format</strong> that gives as much context as possible, so that it’s easy to act upon the findings later (e.g. InvisionApp for visual reviews, Google Docs for text, and so on).</li>
</ul>

<p>We’ve done review walkthroughs for things such as accessibility audits, reviewing feature requests, auditing the implementation of the design, and doing heuristic usability evaluations.</p>

<p>When we do our quarterly accessibility reviews, our accessibility consultant Joakim first goes through the interface and documents and prioritizes the issues he’s found in a shared Google Sheet. Joakim then walks us through the most important issues he’s identified.</p>

<p>Meeting face-to-face (or at least on video) to go through the issues helps create an environment for learning rather than a feeling of being supervised or micromanaged.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg"
			
			sizes="100vw"
			alt="Three people in a sofa gathered around a laptop. They’re discussing and smiling."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Accessibility review: Joakim (right) walks Ingvild and Dag-Inge through the accessibility issues he found in his audit. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ef4aac65-f779-4c7d-98dd-aeba501cba07/09-accessibility-review.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>If you find yourself always being tied up with something that’s due for release, or fixing whatever is at the top of your inbox, reviews can help remedy that. If you set aside regular half days for reviewing work you’ve already done, you can identify issues before they become urgent. It can also help you refocus and make sure you’re priorities are keeping along the right lines. Your team should maybe not begin building that new feature before you’re confident that the existing features are living up to your standards.</p>

<h2 id="user-testing-is-a-form-of-review">User Testing Is A Form Of Review</h2>

<p>An important motivation for code reviews is to reduce risk. By doing it every single time you introduce a change or add something new to your product, and not just when you suspect something is maybe not up to par, you diminish the chance of shipping bugs or subpar features. I believe we should look at <a href="https://confrere.com/about/how-we-work/user-testing">user testing</a> from the same perspective.</p>

<p>You see, if you want to reduce the risk of shipping with major usability issues, user testing has to be part of your process. Just having your UX designers review the interface isn’t enough. <a href="https://www.measuringu.com/blog/effective-he.php">Several studies</a> have found that even usability experts fail in identifying every actual usability problems. On average, 1 in 3 issues identified by experts were false alarms &mdash; they weren’t issues for users in practice. But worse, 1 in 2 issues that users did in fact have, were overlooked by the experts.</p>

<p>Skipping user testing is just as big a risk as skipping code review.</p>

<h2 id="does-review-mean-death-to-creativity">Does Review Mean Death To Creativity?</h2>

<p>People working within design, user experience, and content often have educational backgrounds from art schools or maybe literature, in which the sole creator or creative artistic genius is hailed as the ideal. If you go back in history, this used to be the case for developers as well. Over time, this has changed by necessity as web development has grown more complex.</p>

<p>If you cling to the idea of creativity coming from somewhere deep within yourself, the idea of review might feel threatening or scary. Someone meddling in your half-finished work? Ouch. But if you think about creativity as something that can spring from many sources, including dialogue, collaboration, or any form of inspiration (whether from the outside or from someplace within you), then a review is only an asset and an opportunity.</p>

<p>As long as we’re building something for the web, there’s no way around collaborating with other people, be it within our own field or others. And a good idea will survive review.</p>

<p>Let’s create something great together.</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/">Improving The Double Diamond Design Process</a></li>
<li><a href="https://www.smashingmagazine.com/2024/01/feature-centricity-harming-product/">The Feature Trap: Why Feature Centricity Is Harming Your Product</a></li>
<li><a href="https://www.smashingmagazine.com/2024/02/frequently-heard-beginning-front-end-web-development-class/">Frequently Heard In My Beginning Front-End Web Development Class</a></li>
<li><a href="https://www.smashingmagazine.com/2023/05/impact-agile-methodologies-code-quality/">The Impact Of Agile Methodologies On Code Quality</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(rb, ra, yk, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Rachel Andrew</author><title>Working Together: How Designers And Developers Can Communicate To Create Better Projects</title><link>https://www.smashingmagazine.com/2018/04/working-together-designers-developers/</link><pubDate>Tue, 24 Apr 2018 14:50:19 +0000</pubDate><guid>https://www.smashingmagazine.com/2018/04/working-together-designers-developers/</guid><description>Creating a team who can work well together across different disciplines can be hard. Given the wide range of skills held by the line-up at the upcoming SmashingConf Toronto, Rachel Andrew solicits some suggestions from the speakers. She’s wrapped those up with her own experience of 20 years working alongside designers and other developers.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2018/04/working-together-designers-developers/" />
              <title>Working Together: How Designers And Developers Can Communicate To Create Better Projects</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Working Together: How Designers And Developers Can Communicate To Create Better Projects</h1>
                  
                    
                    <address>Rachel Andrew</address>
                  
                  <time datetime="2018-04-24T14:50:19&#43;00:00" class="op-published">2018-04-24T14:50:19+00:00</time>
                  <time datetime="2018-04-24T14:50:19&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>Among the most popular suggestions on Smashing Magazine’s Content User Suggestions board is the need of learning more about the interaction and communication between designers and developers. There are probably several articles worth of very specific things that could be covered here, but I thought I would kick things off with a general post rounding up some experiences on the subject.</p>

<p>Given the wide range of skills held by the line-up at our upcoming <a href="https://smashingconf.com/toronto-2018/">SmashingConf Toronto</a> — a fully live, no-slides-allowed event, I decided to solicit some feedback. I’ve wrapped those up with my own experience of 20 years working alongside designers and other developers. I hope you will add your own experiences in the comments.</p>

<p>Some tips work best when you can be in the same room as your team, and others are helpful for the remote worker or freelancer. What shines through all of the advice, however, is <strong>the need to respect each other</strong>, and the fact that everyone is working to try and create the best outcome for the project.</p>

<div class="c-felix-the-cat">
<h4 class="h3">Working Remotely And Staying Connected</h4>
<p>The nomadic lifestyle is not right for everyone, but the only way to know for sure is to try. If you can afford to take the risk, go for it. Javier Cuello shares his experience and insights from his four years of travel and work. <a href="https://www.smashingmagazine.com/2018/03/nomadic-designer-tips-tricks/" class="btn btn--small btn--white btn--white--bordered">Read&nbsp;article&nbsp;&rarr;</a></p>
</div>

<p>For many years, my own web development company operated as an outsourced web development provider for design agencies. This involved doing everything from front-end development to implementing e-commerce and custom content management solutions. Our direct client was the designer or design agency who had brought us on board to help with the development aspect of the work, however, in an ideal situation, we would be part of the team working to deliver a great end result to the end client.</p>

<p>Sometimes this relationship worked well. We would feel a valued part of the team, our ideas and experience would count, we would work with the designers to come up with the best solution within budgetary, time, and other constraints.</p>

<p>In many cases, however, no attempt was made to form a team. The design agency would throw a picture of a website as a PDF file over the fence to us, then move on to work on their next project. There was little room for collaboration, and often the designer who had created the files was busy on some other work when we came back with questions.</p>

<p>It was an unsatisfactory way to work for everyone. We would be frustrated because we did not have a chance to help ensure that what was designed was possible to be built in a performant and accessible way, within the time and budget agreed on. The designer of the project would be frustrated: Why were these developers asking so many questions? Can they not just build the website as I have designed? Why are the fonts not the size I wanted?</p>

<p>The <a href="https://www.seguetech.com/waterfall-vs-agile-methodology/">Waterfall versus Agile</a> argument might be raised here. The situation where a PDF is thrown over the fence is often cited as an example of how bad a Waterfall approach is. Still, working in a fully Agile way is often not possible for teams made of freelancers or separate parties doing different parts of the work. Therefore, in reading these suggestions, look at them through the lens of the projects you work on. However, try not to completely discount something as unworkable because you can’t use the full process. There are often things we can take without needing to fully adopt one methodology or another.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></strong>, Steven Hoober’s brand-new guide on <strong>designing for mobile</strong> with proven, universal, human-centric guidelines. <strong>400 pages</strong>, jam-packed with in-depth user research and <strong>best practices</strong>.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/14bcab88-b622-47f6-a51d-76b0aa003597/touch-design-book-shop-opt.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png"
    alt="Feature Panel"
    width="480"
    height="697"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="setting-up-a-project-for-success">Setting Up A Project For Success</h2>

<p>I came to realize that very often the success of failure of the collaboration started before we even won the project, with the way in which we proposed the working relationship. We had to explain upfront that experience had taught us that the approach of us being handed a PDF, quoting and returning a website did not give the best results.</p>

<p>Projects that were successful had a far more iterative approach. It might not be possible to have us work alongside the designers or in a more Agile way. However, having a number of rounds of design and development with <strong>time for feedback from each side</strong> went a long way to prevent the frustrations of a method where work was completed by each side independently.</p>

<h2 id="creating-working-relationships">Creating Working Relationships</h2>

<p>Having longer-term relationships with an agency, spanning a number of projects worked well. We got to know the designers, learned how they worked, could anticipate their questions and ensure that we answered them upfront. We were able to share development knowledge, the things that made a design easier or harder to implement which would, therefore, have an impact on time and budget. They were able to communicate better with us in order to explain why a certain design element was vital, even if it was going to add complexity.</p>

<p>For many freelance designers and developers, and also for those people who work for a distributed company, <strong>communication can become mostly text-based</strong>. This can make it particularly hard to build relationships. There might be a lot of communication — by email, in Slack, or through messages on a project management platform such as Basecamp. However, all of these methods leave us without the visual cues we might pick up from in-person meetings. An email we see as to the point may come across to the reader as if we are angry. The quick-fire nature of tools such as Slack might leave us committing in writing something which we would not say to that person while looking into their eyes!</p>

<p>Freelance data scientist <a href="https://www.visualcinnamon.com">Nadieh Bremer</a> will talk to us about <a href="https://smashingconf.com/live/speakers/nadieh-bremer">visualizing data</a> in Toronto. She has learned that meeting people face to face — or at least having a video call — is important. She told me:</p>

<blockquote><a href="https://smashingconf.com/live/speakers/nadieh-bremer"><img loading="lazy" decoding="async"  style="float: right; padding: 1em;" src="https://files.smashing.media/articles/working-together-designers-developers/nadieh-bremer.png" alt="Nadieh Bremer" width="180" height="180"></a><p>“As a remote freelancer, I know that to interact well with my clients I really need to have a video call (stress on the video) I need to see their face and facial/body interactions and they need to see mine. For clients that I have within public transport distance, I used to travel there for a first ‘getting to know each other/see if we can do a project’ meeting, which would take loads of time. But I noticed for my clients abroad (that I can’t visit anyway) that a first client call (again, make sure it’s a video-call) works more than good enough.<br /><br />It’s the perfect way to weed out the clients that need other skills that I can give, those that are looking for a cheap deal, and those where I just felt something wasn’t quite clicking or I’m not enthusiastic about the project after they’ve given me a better explanation. So these days I also ask my clients in the Netherlands, where I live, that might want to do a first meeting to have it online (and once we get on to an actual contract I can come by if it’s beneficial).”</p></blockquote>

<h2 id="working-in-the-open">Working In The Open</h2>

<p>Working in the open (with the project frequently deployed to a staging server that everyone had access to see), helped to support an iterative approach to development. I found that it was important to support that live version with explanations and notes of what to look at and test and what was still half finished. If I just invited people to look at it without that information we would get lists of fixes to make to unfinished features, which is a waste of time for the person doing the reporting. However, a live staging version, plus notes in a collaboration tool such as Basecamp meant that we could deploy sections and post asking for feedback on specific things. This helped to <strong>keep everyone up to date and part of the project</strong> even if — as was often the case for designers in an agency — they had a number of other projects to work on.</p>

<p>There are collaboration tools to help designers to share their work too. Asking for recommendations on Twitter gave me suggestions for <a href="https://zeplin.io/">Zeplin</a>, <a href="https://www.invisionapp.com/">Invision</a>, <a href="https://www.figma.com/">Figma</a>, and <a href="https://www.adobe.com/products/xd.html">Adobe XD</a>. Showing work in progress to a developer can help them to catch things that might be tricky before they are signed off by the client. By sharing the goal behind a particular design feature within the team, a way forward can be devised that meets the goal without blowing the budget.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b6bc7a52-9de9-4a7b-be03-9c6a67bc89da/zeplin-screenshot.png"
			
			sizes="100vw"
			alt="Screenshot of the Zeplin homepage"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Zeplin is a collaboration tool for developers and designers
    </figcaption>
  
</figure>

<h2 id="scope-creep-and-change-requests">Scope Creep And Change Requests</h2>

<p>The thing about working in the open is that people then start to have ideas (which should be a positive thing), however, most timescales and budgets are not infinite! This means you need to learn to deal with scope creep and change requests in a way that maintains a good working relationship.</p>

<p>We would often get requests for things that were trivial to implement with a message saying how sorry they were about this huge change and requests for incredibly time-consuming things with an assumption it would be quick. <strong>Someone who is not a specialist has no idea how long anything will take</strong>. Why should they? It is important to remember this rather than getting frustrated about the big changes that are being asked for. Have a conversation about the change, explain why it is more complex than it might appear, and try to work out whether this is a vital addition or change, or just a nice idea that someone has had.</p>

<p>If the change is not essential, then it may be enough to log it somewhere as a phase two request, demonstrating that it has been heard and won’t be forgotten. If the big change is still being requested, we would outline the time it would take and give options. This might mean dropping some other feature if a project has a fixed budget and tight deadline. If there was flexibility then we could outline the implications on both costs and end date.</p>

<p>With regard to costs and timescales, we learned early on to pad our project quotes in order that we could absorb some small changes without needing to increase costs or delay completion. This helped with the relationship between the agency and ourselves as they didn’t feel as if they were being constantly nickel and dimed. <strong>Small changes were expected as part of the process of development</strong>. I also never wrote these up in a quote as <em>contingency</em>, as a client would read that and think they should be able to get the project done without dipping into the contingency. I just added the time to the quote for the overall project. If the project ran smoothly and we didn’t need that time and money, then the client got a smaller bill. No one is ever unhappy about being invoiced for less than they expected!</p>

<p>This approach can work even for people working in-house. Adding some time to your estimates means that you can absorb small changes without needing to extend the timescales. It helps working relationships if you are someone who is able to say yes as often as possible.</p>

<p>This does require that you become adept at <a href="https://rachelandrew.co.uk/archives/2014/06/20/how-to-become-good-at-estimating-time/">estimating timescales</a>. This is a skill you can develop by logging your time to achieve your work, even if you don’t need to log your time for work purposes. While many of the things you design or develop will be unique, and seem impossible to estimate, by consistently logging your time you will generally find that your ballpark estimates become more accurate as you make yourself aware of how long things <em>really</em> take.</p>

<div class="partners__lead-place"></div>

<h2 id="respect">Respect</h2>

<p><a href="https://archive.smashingconf.com/toronto-2018/speakers/aaron-draplin.html">Aaron Draplin</a> will be bringing tales from his career in design to Toronto, and responded with the thought that it comes down to respect for your colleague’s craft:</p>

<blockquote><img loading="lazy" decoding="async"  style="float: right; padding: 1em;" src="https://files.smashing.media/articles/working-together-designers-developers/aaron-james-draplin.jpeg" alt="Aaron Draplin" width="180" height="180"><p>“It all comes down to respect for your colleague’s craft, and sort of knowing your place and precisely where you fit into the project. When working with a developer, I surrender to them in a creative way, and then, defuse whatever power play they might try to make on me by leading the charges with constructive design advice, lightning-fast email replies and generally keeping the spirit upbeat. It’s an odd offense to play. I’m not down with the adversarial stuff. I’m quick to remind them we are all in the same boat, and, who’s paying their paycheck. And that’s not me. It’s the client. I’ll forever be on their team, you know? We make the stuff for the client. Not just me. Not ‘my team’. We do it together. This simple methodology has always gone a long way for me.”</p></blockquote>

<p>I love this, it underpins everything that this article discusses. Think back to any working relationship that has gone bad, how many of those involved you feeling as if the other person just didn’t understand your point of view or the things you believe are important? Most reasonable people understand that compromise has to be made, it is when it appears that your point of view is not considered that frustration sets in.</p>

<p>There are sometimes situations where a decision is being made, and your experience tells you it is going to result in a bad outcome for the project, yet you are overruled. On a few occasions, decisions were made that I believed so poor; I asked for the decision and our objection to it be put in writing, in order that we could <strong>not be held accountable for any bad outcome</strong> in future. This is not something you should feel the need to do often, however, it is quite powerful and sometimes results in the decision being reversed. An example would be of a client who keeps insisting on doing something that would cause an accessibility problem for a section of their potential audience. If explaining the issue does not help, and the client insists on continuing, ask for that decision in writing in order to document your professional advice.</p>

<h2 id="learning-the-language">Learning The Language</h2>

<p>I recently had the chance to bring my <a href="https://www.smashingmagazine.com/author/rachel-andrew/">CSS Layout Workshop</a> not to my usual groups of front-end developers but instead to a group of UX designers. Many of the attendees were there not to improve their front-end development skills, but more to understand enough of how modern CSS Layout worked that they could have better conversations with the developers who built their designs. Many of them had also spent years being told that certain things were not possible on the web, but were realizing that the possibilities in CSS were changing through things like CSS Grid. They were learning some CSS not necessarily to become proficient in shipping it to production, but so they could share a common language with developers.</p>

<p>There are often debates on whether “designers should learn to code.” In reality, I think <strong>we all need to learn something of the language, skills, and priorities</strong> of the other people on our teams. As Aaron reminded us, we are all on the same team, we are making stuff together. Designers should learn something about code just as developers should also learn something of design. This gives us more of a shared language and understanding.</p>

<p><a href="https://seb.ly/">Seb Lee-Delisle</a>, who will speak on the subject of Hack to the Future in Toronto, agrees:</p>

<blockquote><img loading="lazy" decoding="async"  style="float: right; padding: 1em;" src="https://files.smashing.media/articles/working-together-designers-developers/download.jpeg" alt="Seb Lee-Delisle" width="180" height="180"><p>“I have basically made a career out of being both technical and creative so I strongly feel that the more crossover the better. Obviously what I do now is wonderfully free of the constraints of client work but even so, I do think that if you can blur those edges, it’s gonna be good for you. It’s why I speak at design conferences and encourage designers to play with creative coding, and I speak at tech conferences to persuade coders to improve their visual acuity. Also with creative coding. :) It’s good because not only do I get to work across both disciplines, but also I get to annoy both designers and coders in equal measure.”</p></blockquote>

<p>I have found that introducing designers to browser DevTools (in particular the layout tools in <a href="https://www.smashingmagazine.com/2017/12/grid-inspector/">Firefox</a> and also to various code generators on the web) has been helpful. By being able to test ideas out without writing code, helps a designer who isn’t confident in writing code to have better conversations with their developer colleagues. Playing with tools such as <a href="https://cssgradient.io/">gradient generators</a>, <a href="https://bennettfeely.com/clippy/">clip-path</a> or <a href="https://animista.net/">animation tools</a> can also help designers see what is possible on the web today.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/827ddb67-0a83-4e7f-9adc-06a42e43c8a4/animista-screenshot.png"
			
			sizes="100vw"
			alt="Screenshot of Animista"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Animista has demos of different styles of animation
    </figcaption>
  
</figure>

<p>We are also seeing a number of tools that can help people create websites in a more visual way. Developers can sometimes turn their noses up about the code output of such tools, and it’s true they probably won’t be the best choice for the production code of a large project. However, they can be an excellent way for everyone to prototype ideas, without needing to write code. Those prototypes can then be turned into robust, permanent and scalable versions for production.</p>

<p>An important tip for developers is to refrain from commenting on the code quality of prototypes from members of the team who do not ship production code! Stick to what the prototype is showing as opposed to how it has been built.</p>

<h2 id="a-practical-suggestion-to-make-things-visual">A Practical Suggestion To Make Things Visual</h2>

<p><a href="https://www.evalotta.net/">Eva-Lotta Lamm</a> will be speaking in Toronto about Sketching and perhaps unsurprisingly passed on practical tips for helping conversation by visualizing the problem to support a conversation.</p>

<blockquote>"<img loading="lazy" decoding="async"  style="float: right; padding: 1em;" src="https://files.smashing.media/articles/working-together-designers-developers/images.jpeg" alt="Eva-Lotta Lamm" width="180" height="180"><p>Creating a shared picture of a problem or a solution is a simple but powerful tool to create understanding and make sure they everybody is talking about the same thing.<br /><br />Visualizing a problem can reach from quick sketches on a whiteboard to more complex diagrams, like customer journey diagrams or service blueprints.<br /><br />But even just spatially distributing words on a surface adds a valuable layer of meaning. Something as simple as arranging post-its on a whiteboard in different ways can help us to see relationships, notice patterns, find gaps and spot outliers or anomalies. If we add simple structural elements (like arrows, connectors, frames, and dividers) and some sketches into the mix, the relationships become even more obvious.<br /><br />Visualising a problem creates context and builds a structural frame that future information, questions, and ideas can be added to in a ‘systematic’ way.<br /><br />Visuals are great to support a conversation, especially when the conversation is ‘messy’ and several people involved.<br /><br />When we visualize a conversation, we create an external memory of the content, that is visible to everybody and that can easily be referred back to. We don’t have to hold everything in our mind. This frees up space in everybody’s mind to think and talk about other things without the fear of forgetting something important. Visuals also give us something concrete to hold on to and to follow along while listening to complex or abstract information.<br /><br />When we have a visual map, we can point to particular pieces of content &mdash; a simple but powerful way to make sure everybody is talking about the same thing. And when referring back to something discussed earlier, the map automatically reminds us of the context and the connections to surrounding topics.<br /><br />When we sketch out a problem, a solution or an idea the way we see it (literally) changes. Every time we express a thought in a different medium, we are forced to shape it in a specific way, which allows us to observe and analyze it from different angles.<br /><br />Visualising forces us to make decisions about a problem that words alone don’t. We have to decide where to place each element, decide on its shape, size, its boldness, and color. We have to decide what we sketch and what we write. All these decisions require a deeper understanding of the problem and make important questions surface fairly quickly.<br /><br />All in all, supporting your collaboration by making it more visual works like a catalyst for faster and better understanding."</p>
</blockquote>

<p>Working in this way is obviously easier if your team is working in the same room. For distributed teams and freelancers, there are alternatives to communicate in ways other than words, e.g. by making a quick Screencast to demonstrate an issue, or even sketching and photographing a diagram can be incredibly helpful. There are collaborative tools such as <a href="https://www.milanote.com/">Milanote</a>, <a href="https://mural.co/">Mural</a>, and <a href="https://niice.co/">Niice</a>; such tools can help with the process Eva-Lotta described even if people can’t be in the same room.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c6df847e-8952-4f61-9b49-7a50f514eec5/niice-screenshot.png"
			
			sizes="100vw"
			alt="Screenshot of the Niice website"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Niice helps you to collect and discuss ideas
    </figcaption>
  
</figure>

<p>I’m very non-visual and have had to learn how useful these other methods of communication are to the people I work with. I have been guilty on many occasions of forgetting that just because <strong>I</strong> don’t personally find something useful, it is still helpful to other people. It is certainly a good idea to change how you are trying to communicate an idea if it becomes obvious that you are talking at cross-purposes.</p>

<h2 id="over-to-you">Over To You</h2>

<p>As with most things, there are many ways to work together. Even for remote teams, there is a range of tools which can help break down barriers to collaborating in a more visual way. However, no tool is able to fix problems caused by a lack of respect for the work of the rest of the team. A good relationship starts with the ability for all of us to take a step back from our strongly held opinions, listen to our colleagues, and learn to compromise. We can then choose tools and workflows which help to <strong>support that understanding that we are all on the same team</strong>, all trying to do a great job, and all have important viewpoints and experience to bring to the project.</p>

<p>I would love to hear your own experiences working together in the same room or remotely. What has worked well — or not worked at all! Tools, techniques, and lessons learned are all welcome in the comments. If you would be keen to see tutorials about specific tools or workflows mentioned here, perhaps add a suggestion to our User Suggestions board, too.</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2023/12/recovering-deleted-files-git-working-tree/">Recovering Deleted Files From Your Git Working Tree</a></li>
<li><a href="https://www.smashingmagazine.com/2024/01/feature-centricity-harming-product/">The Feature Trap: Why Feature Centricity Is Harming Your Product</a></li>
<li><a href="https://www.smashingmagazine.com/2019/10/frontend-developers-empower-designers-work/">How Frontend Developers Can Empower Designer’s Work</a></li>
<li><a href="https://www.smashingmagazine.com/2023/01/sharing-components-designers-developers-collaboration-problems/">Making Your Collaboration Problems Go Away By Sharing Components</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Tim Noetzel</author><title>How To Improve Your Design Process With Data-Based Personas</title><link>https://www.smashingmagazine.com/2018/04/design-process-data-based-personas/</link><pubDate>Tue, 17 Apr 2018 11:40:40 +0000</pubDate><guid>https://www.smashingmagazine.com/2018/04/design-process-data-based-personas/</guid><description>What do data-driven personas look like, and how do you make one? Creating personas based on actual user data is a great way to build internal consensus, improve your product&amp;rsquo;s UX, and make your design team more effective. But it is a challenging project that takes time and dedication. In this article, Tim Noetzel will show you how to create and use data-driven personas to improve your design process.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2018/04/design-process-data-based-personas/" />
              <title>How To Improve Your Design Process With Data-Based Personas</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>How To Improve Your Design Process With Data-Based Personas</h1>
                  
                    
                    <address>Tim Noetzel</address>
                  
                  <time datetime="2018-04-17T11:40:40&#43;00:00" class="op-published">2018-04-17T11:40:40+00:00</time>
                  <time datetime="2018-04-17T11:40:40&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>Most design and product teams have some type of persona document. Theoretically, personas help us better understand our users and meet their needs. The idea is that codifying what we’ve learned about distinct groups of users helps us make better design decisions. Referring to these documents ourselves and sharing them with non-design team members and external stakeholders should ultimately lead to a user experience more closely aligned with what real users actually need.</p>

<p>In reality, personas rarely prove equal to these expectations. On many teams, persona documents sit abandoned on hard drives, collecting digital dust while designers continue to create products based primarily on whim and intuition.</p>

<p>In contrast, well-researched personas serve as a proxy for the user. They help us check our work and ensure that we’re building things users really need.</p>

<p>In fact, the best personas don’t just describe users; they actually help designers predict their behavior. In her article on persona creation, Laura Klein <a href="https://www.invisionapp.com/blog/predictive-personas/">describes it perfectly</a>:</p>

<blockquote>“If you can create a predictive persona, it means you truly know not just what your users are like, but the exact factors that make it likely that a person will become and remain a happy customer.”</blockquote>

<p>In other words, <em>useful</em> personas actually help design teams make better decisions because they can predict with some accuracy how users will respond to potential product changes.</p>

<p>Obviously, for personas to facilitate these types of predictions, they need to be based on more than intuition and anecdotes. They need to be data-driven.</p>

<p>So, what do data-driven personas look like, and how do you make one?</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="start-with-what-you-think-you-know">Start With What You Think You Know</h2>

<p>The first step in creating data-driven personas is similar to the typical persona creation process. Write down your team’s hypotheses about what the key user groups are and what’s important to each group.</p>

<p>If your team is like most, some members will disagree with others about which groups are important, the particular makeup and qualities of each persona, and so on. This type of disagreement is healthy, but unlike the usual persona creation process you may be used to, you’re not going to get bogged down here.</p>

<p>Instead of debating the merits of each persona (and the various facets and permutations thereof), the important thing is to be specific about the different hypotheses you and your team have and write them down. You’re going to validate these hypotheses later, so it’s okay if your team disagrees at this stage. You may choose to focus on a few particular personas, but make sure to keep a backlog of other ideas as well.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png"
			
			sizes="100vw"
			alt="Hypothetical Personas"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      First, start by recording all the hypotheses you have about key personas. You’ll refine these through user research in the next step. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee48c787-c759-4774-8b44-f2d8ef16aeeb/persona-hypotheses.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>I recommend aiming for a short, 1&ndash;2 sentence description of each hypothetical persona that details who they are, what root problem they hope to solve by using your product, and any other pertinent details.</p>

<p>You can use the traditional <a href="https://www.smashingmagazine.com/2018/01/comprehensive-guide-product-design/#4-ideation">user stories framework</a> for this. If you were creating hypothetical personas for Craigslist, one of these statements might read:</p>

<blockquote>“As a recent college grad, I want to find cheap furniture so I can furnish my new apartment.”</blockquote>

<p>Another might say:</p>

<blockquote>“As a homeowner with an extra bedroom, I want to find a responsible tenant to rent this space to so I can earn some extra income.”</blockquote>

<p>If you have existing data &mdash; things like user feedback emails, NPS scores, user interview notes, or analytics data &mdash; be sure to go over them and include relevant data points in your notes along with your user stories.</p>

<h2 id="validate-and-refine">Validate And Refine</h2>

<p>The next step is to validate and refine these hypotheses with user interviews. For each of your hypothetical personas, you’ll want to start by interviewing 5 to 10 people who fit that group.</p>

<p>You have three key goals for these interviews. For each group, you need to:</p>

<ol>
<li>Understand the context in which they need to solve the problem.</li>
<li>Confirm that members of the persona group agree that the problem you recorded is an urgent and painful one that they struggle to solve now.</li>
<li>Identify key predictors of whether a member of this persona is likely to become and remain an active user.</li>
</ol>

<p>The approach you take to these interviews may vary, but I recommend a hybrid approach between a traditional user interview, which is very non-leading, and a <a href="https://startitup.co/guides/285/problem-interview-script">Lean Problem</a> interview, which is deliberately leading.</p>

<p>Start with the traditional user interview approach and ask <a href="https://medium.com/interactive-mind/5-steps-to-create-good-user-interview-questions-by-metacole-a-comprehensive-guide-8a591b0e2162">behavior-based, non-leading questions</a>. In the Craigslist example, we might ask the recent college grad something like:</p>

<blockquote>“Tell me about the last time you purchased furniture. What did you buy? Where did you buy it?”</blockquote>

<p>These types of questions are great for establishing whether the interviewee recently experienced the problem in question, how they solved it, and whether they’re dissatisfied with their current solution.</p>

<p>Once you’ve finished asking these types of questions, move on to the <em>Lean Problem</em> portion of the interview. In this section, you want to tell a story about a time when you experienced the problem &mdash; establishing the various issues you struggled with and why it was frustrating &mdash; and see how they respond.</p>

<p>You might say something like this:</p>

<blockquote>“When I graduated college, I had to get new furniture because I wasn’t living in the dorm anymore. I spent forever looking at furniture stores, but they were all either ridiculously expensive or big-box stores with super-cheap furniture I knew would break in a few weeks. I really wanted to find good furniture at a reasonable price, but I couldn’t find anything and I eventually just bought the cheap stuff. It inevitably broke, and I had to spend even more money, which I couldn’t really afford. Does any of that resonate with you?”</blockquote>

<p>What you’re looking for here is emphatic agreement. If your interviewee says "yes, that resonates" but doesn’t get much more excited than they were during the rest of the interview, the problem probably wasn’t that painful for them.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png"
			
			sizes="100vw"
			alt="Data-Driven Personas Interview Format"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      You can validate or invalidate your persona hypotheses with a series of quick, 30-minute interviews. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6f3cdb57-4574-49f5-a89a-b4244b9588b4/data-driven-persona-interviews.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>On the other hand, if they get excited, empathize with your story, or give their own anecdote about the problem, you know you’ve found a problem they really care about and need to be solved.</p>

<p>Finally, make sure to ask any demographic questions you didn’t cover earlier, especially those around key attributes you think might be significant predictors of whether somebody will become and remain a user. For example, you might think that recent college grads who get high-paying jobs aren’t likely to become users because they can afford to buy furniture at retail; if so, be sure to ask about income.</p>

<p>You’re looking for predictable patterns. If you bring in 5 members of your persona and 4 of them have the problem you’re trying to solve and desperately want a solution, you’ve probably identified a key persona.</p>

<p>On the other hand, if you’re getting inconsistent results, you likely need to refine your hypothetical persona and repeat this process, using what you learn in your interviews to form new hypotheses to test. If you can’t consistently find users who have the problem you want to solve, it’s going to be nearly impossible to get millions of them to use your product. So don’t skimp on this step.</p>

<div class="partners__lead-place"></div>

<h2 id="create-your-personas">Create Your Personas</h2>

<p>The penultimate step in this process is creating the actual personas themselves. This is where things get interesting. Unlike traditional personas, which are typically static, your data-driven personas will be living, breathing documents.</p>

<p>The goal here is to combine the lessons you learned in the previous step &mdash; about who the user is and what they need &mdash; with data that shows how well the latest iteration of your product is serving their needs.</p>

<p>At my company <a href="https://swish.com">Swish</a>, each one of our personas includes two sections with the following data:</p>

<table class="tablesaw break-out" data-tablesaw-mode="swipe" data-tablesaw-minimap>
    <thead>
        <tr>
            <th data-tablesaw-priority="persist">Predictive User Data</th>
            <th>Product Performance Data</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Description of the user including predictive demographics.</td>
            <td>The percentage of our <em>current</em> user base the persona represents.</td>
        </tr>
        <tr>
            <td>Quotes from at least 3 actual users that describe the <a href="https://www.invisionapp.com/blog/know-your-customer/">jobs-to-be-done</a>.</td>
            <td>Latest <a href="https://blog.popcornmetrics.com/pirate-metrics-aarrr-a-beginners-guide-for-entrepreneurs-marketers-and-agencies/">activation, retention, and referral rates</a> for the persona.</td>
        </tr>
        <tr>
            <td>The percentage of the <em>potential</em> user base the persona represents.</td>
            <td>Current NPS Score for the persona.</td>
        </tr>
    </tbody>
</table>

<p>If you’re looking for more ideas for data to include, check out <a href="https://www.slideshare.net/coryndon/scaling-empathy-with-personas">Coryndon Luxmoore’s presentation</a> on how his team created data-driven personas at Buildium.</p>

<p>It may take some time for your team to produce all this information, but it’s okay to start with what you have and improve the personas over time. Your personas won’t be sitting on a shelf. Every time you release a new feature or change an existing one, you should measure the results and update your personas accordingly.</p>

<h2 id="integrate-your-personas-into-your-workflow">Integrate Your Personas Into Your Workflow</h2>

<p>Now that you’ve created your personas, it’s time to actually use them in your day-to-day design process. Here are 4 opportunities to use your new data-driven personas: </p>

<ol>
<li><strong>At Standups</strong><br />At Swish, our standups are a bit different. We start these meetings by reviewing the activation, retention, and referral metrics for each persona. This ensures that &mdash; as we discuss yesterday’s progress and today’s obstacles &mdash; we remain focused on what really matters: how well we’re serving our users.</li>
<li><strong>During Prioritization</strong><br />Your data-driven personas are a great way to keep team members honest as you discuss new features and changes. When you know how much of your user base the persona represents and how well you’re serving them, it quickly becomes obvious whether a potential feature could actually make a difference. Suddenly deciding what to work on won’t require hours of debate or horse-trading.</li>
<li><strong>At Design Reviews</strong><br />Your data-driven personas are a great way to keep team members honest as you discuss new designs. When team members can creditably represent users with actual quotes from user interviews, their feedback quickly becomes less subjective and more useful.</li>
<li><strong>When Onboarding New Team Members</strong><br />New hires inevitably bring a host of implicit biases and assumptions about the user with them when they start. By including your data-driven personas in their onboarding documents, you can get new team members up to speed much more quickly and ensure they understand the hard-earned lessons your team learned along the way.</li>
</ol>

<h2 id="keeping-your-personas-up-to-date">Keeping Your Personas Up To Date</h2>

<p>It’s vitally important to keep your personas up-to-date so your team members can continue to rely on them to guide their design thinking.</p>

<p>As your product improves, it’s simple to update NPS scores and performance data. I recommend doing this monthly at a minimum; if you’re working on an early-stage, rapidly-changing product, you’ll get better mileage by updating these stats weekly instead.</p>

<p>It’s also important to check in with members of your personas periodically to make sure your predictive data stays relevant. As your product evolves and the competitive landscape changes, your users’ views about their problems will change as well. If your growth starts to plateau, another round of interviews may help to unlock insights you didn’t find the first time. Even if everything is going well, try to check in with members of your personas &mdash; both current users of your product and some non-users &mdash; every 6 to 12 months.</p>

<h2 id="wrapping-up">Wrapping Up</h2>

<p>Building data-driven personas is a challenging project that takes time and dedication. You won’t uncover the insights you need or build the conviction necessary to unify your team with a week-long throwaway project.</p>

<p>But if you put in the time and effort necessary, the results will speak for themselves. Having the type of clarity that data-driven personas provide makes it far easier to iterate quickly, improve your user experience, and build a product your users love.</p>

<h3 id="other-resources">Other Resources</h3>

<p>If you’re interested in learning more, I highly recommend checking out the linked articles above, as well as the following resources:</p>

<ul>
<li>“<a href="https://www.amazon.com/Running-Lean-Iterate-Plan-Works/dp/1449305172">Running Lean: How to Iterate from Plan A to a Plan That Works</a>,” Ash Maurya</li>
<li>“<a href="https://conversionxl.com/blog/user-personas/">How to Build Robust User Personas in Under a Month</a>,” Tony Zambito, ConversionXL</li>
<li>“<a href="https://alistapart.com/article/resurrecting-dead-personas">Resurrecting Dead Personas</a>,” Meg Dickey-Kurdziolek, A List Apart</li>
<li>“<a href="https://www.smashingmagazine.com/2014/08/a-closer-look-at-personas-part-2/">A Closer Look At Personas: A Guide To Developing The Right Ones</a>,” Shlomo Goltz, Smashing Magazine.</li>
</ul>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2024/02/designing-ai-beyond-conversational-interfaces/">When Words Cannot Describe: Designing For AI Beyond Conversational Interfaces</a></li>
<li><a href="https://www.smashingmagazine.com/2023/10/ux-research-learn-from-lt-columbo/">Everything I Know About UX Research I First Learned From Lt. Columbo</a></li>
<li><a href="https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/">Improving The Double Diamond Design Process</a></li>
<li><a href="https://www.smashingmagazine.com/2023/12/five-second-testing-case-study/">Five-Second Testing: Taking A Closer Look At First Impressions (Case Study)</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(rb, ra, yk, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Christopher Murphy</author><title>A Comprehensive Guide To User Experience Design</title><link>https://www.smashingmagazine.com/2018/02/comprehensive-guide-user-experience-design/</link><pubDate>Fri, 09 Feb 2018 11:00:34 +0000</pubDate><guid>https://www.smashingmagazine.com/2018/02/comprehensive-guide-user-experience-design/</guid><description>Designers tend to get lost in the details until they have everything mapped out. This is not recommended, as the design process is an iterative one. By establishing a high-level process to kick off the design phase of your projects you can work more efficiently to get a clear framework in place. Focus on establishing a clear design direction, and some clear user goals, before getting into the details. In this guide, Christopher Murphy will help you stay on track.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2018/02/comprehensive-guide-user-experience-design/" />
              <title>A Comprehensive Guide To User Experience Design</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>A Comprehensive Guide To User Experience Design</h1>
                  
                    
                    <address>Christopher Murphy</address>
                  
                  <time datetime="2018-02-09T11:00:34&#43;00:00" class="op-published">2018-02-09T11:00:34+00:00</time>
                  <time datetime="2018-02-09T11:00:34&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>(<em>This is a sponsored article</em>.) Having undertaken initial user research and analyzed your research findings, the next phase of the design process is to apply what you’ve learned by developing a series of designs to test your assumptions. In the fourth article in my series for <a href="https://helpx.adobe.com/xd/get-started.html">Adobe XD</a>, I’ll be focusing on the initial phase of the design process.</p>

<p>Within this overall series of ten articles, this is the first of three that tie together the design process. This article deals with UX design at a higher level, from a birds’ eye point of view. My next article will explore UI design, exploring interface inventories, building pattern libraries and designing interactions and animations. The third article in this series within a series will explore wireframing and prototyping.</p>

<p>As I explored in my <a href="https://www.smashingmagazine.com/2018/01/comprehensive-guide-ux-research/">preceding article on UX research</a>, it’s important to stress that we’re building on the user research undertaken. Having analyzed our research findings, our goal at this phase of the design process is to:</p>

<ul>
<li>establish some clear user pathways that satisfy different users’ needs by embracing user stories, scenarios and storyboarding;</li>
<li>apply some lessons from the world of Human Computer Interaction (HCI) so that we design with first principles in mind; and</li>
<li>establish a ‘look and feel’ for our designs in a manner that’s device-agnostic that can be applied in both a desktop and mobile context.</li>
</ul>

<p>In short, this article is intended to act as <strong>a bridge between the research phase and the design phase</strong>. As I stressed in my last article, the design process — research, design, prototype, build, test — is an iterative one; at this phase in the process, we’re focused on developing a series of designs that we can prototype, build and test.</p>

<p>UX Design is a vast topic so consider this article a short primer, but — as in my previous articles — I’ll provide some suggested reading to ensure you’re well covered.</p>

<h2 id="getting-a-skeleton-in-place">Getting A Skeleton In Place</h2>

<p>Before we get down to the details of user interface (UI) design and building interactive prototypes, it’s important to get the high-level flow of the design in place, establishing a skeleton around which we can build our design.</p>

<p>At this point in the process, <strong>it’s important to use our research findings</strong> to inform the development of user stories, identifying different users’ goals. We can use these user stories to create different scenarios. This helps us to identify clear goals — and an underlying intent — that guides the design process. It also enables us to develop flows through what we’re building.</p>

<p>When developing initial flows — using paper prototypes and storyboards — we’re focused on getting a feel for the design in its totality, before drilling down into detail. It’s important to get a skeleton in place and not get lost in the details, which will follow down the line.</p>

<p>In my <a href="https://www.smashingmagazine.com/2018/01/comprehensive-guide-ux-research/">previous article</a>, I focused on the importance of undertaking user research before you embark upon the design phase of a project. As I put it:</p>

<blockquote>"Spend some time with your users, getting to know their needs, and what it is they are trying to achieve, these are their ‘jobs to be done.’"</blockquote>

<p>By teasing out our users’ ‘jobs to be done,’ we can ensure that what we design is truly user-centered. Having undertaken some focused user research, it’s important to take your findings and use them to inform your design process. Your research should have helped you establish some patterns, needs that the users you’re designing for having in common.</p>

<p>One size rarely fits all, however, and it’s likely that whatever you’re designing will have multiple user types with different needs. Developing ‘user stories’ — that represent the needs of different users — can help you distill down the goals that you’re trying to solve, helping to shape the rest of the process. But what exactly are user stories?</p>

<h3 id="user-stories">User Stories</h3>

<p>User stories are a useful way of establishing a high-level view of different users’ ‘jobs to be done.’ Written from the perspective of typical users, they help you to establish the different goals your different users have so that you can <strong>design for their different needs accordingly</strong>.</p>

<p>The term ‘User Story’ was originated by Alistair Cockburn, one of the initiators of the agile movement in software development, who coined the phrase, “<a href="https://alistair.cockburn.us/Origin+of+user+story+is+a+promise+for+a+conversation">a user story is a promise for a conversation</a>,” during a project for Chrysler in 1998.</p>

<p>User stories shift the emphasis from writing about requirements to talking about them. Whilst subtle, this shift — from writing to talking — can have a significant impact upon the design process.</p>

<p>All too often requirements are delivered in an abstract manner, as a list to be checked off that — if you’re not careful — bears little resemblance to what users need and more resemblance to what a ‘design by committee’ needs. User stories help position users at the heart of the conversation.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8fb52028-0238-4c9a-ab2e-eb5015aaa8ee/ux-1-user-story-opt.png"
			
			sizes="100vw"
			alt="User stories are a great way of defining different users’ needs by positioning the user at the heart of the design process. User stories help you map roles onto actions and goals."
		/>
    

  
    <figcaption class="op-vertical-bottom">
      User stories are a great way of defining different users’ needs by positioning the user at the heart of the design process. User stories help you map roles onto actions and goals.
    </figcaption>
  
</figure>

<p>This idea, of a tool to encourage and facilitate conversation, captures user stories’ strength. They are <strong>an ideal tool to start mapping out scenarios</strong>, ensuring users always remain at the heart of the design and development process.</p>

<p>Short descriptions of goals and features told from the perspective of different users, user stories help you to get an understanding of the underlying goals your users have so that you can see the problem from their perspective. These follow a pattern as follows:</p>

<ul>
<li><strong>As a</strong> (person in a particular role),</li>
<li><strong>I want to</strong> (perform an action or find something out),</li>
<li><strong>So that</strong> (I can achieve my goal of).</li>
</ul>

<p>Using the above template, we can put ourselves in the shoes of different users and develop different stories to shape our design. Imagine, for example, that we’re building a web-based learning resource where lecturers and students can share learning materials. We’re likely to have a number of different users with different needs. A lecturer’s user story might be:</p>

<blockquote>"As a lecturer, I want to share my lecture slides so that I can provide my students with access to resources beyond the classroom."</blockquote>

<p>By developing a short story around this user’s specific needs, we can begin to envisage design patterns that satisfy this type of user. Seen from the perspective of a student — a different user with different needs — we might develop the following user story:</p>

<blockquote>"As a student, I want to access lecture slides so that I can refer to them when I’m revising."</blockquote>

<p>These stories — relayed from different perspectives — provide us with useful provocations we can use at the start of the design process to start mapping out our design at a high level. Importantly, the stories are focused on satisfying our users’ needs. In short, <strong>user stories help us to get a feel for what users’ goals are</strong> at a high level. We can then use these stories to develop different scenarios which we can begin to design.</p>

<h3 id="using-scenarios-to-inform-your-design">Using Scenarios To Inform Your Design</h3>

<p>At the start of a project, it’s easy to get carried away adding features aplenty and getting lost in ‘featuritis.’ The danger of this approach is that it’s easy to begin adding features and functionality that detract from your users’ core goals.</p>

<p>By using user stories to develop typical scenarios, you remain focused on your users’ core goals. This approach also enables you to establish expectations and develop benchmarks for typical user needs, which can be used to <strong>set clear deliverables and scope at the start of the project</strong>.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/97aa157a-d62f-44cc-93cf-ce372b06a13e/ux-2-user-story-map-opt.png"
			
			sizes="100vw"
			alt="Starting with user stories, we can begin to build different scenarios that satisfy varying users’ needs. Mapping these stories and building flows allows us to establish how different users’ needs are accommodated."
		/>
    

  
    <figcaption class="op-vertical-bottom">
      Starting with user stories, we can begin to build different scenarios that satisfy varying users’ needs. Mapping these stories and building flows allows us to establish how different users’ needs are accommodated.
    </figcaption>
  
</figure>

<p>Returning to the previous example, we can establish some high-level goals from the perspective of our different users: for the lecturer, we’re going to need to design an upload feature; for the student, we’re going to need to design an access feature. These are high-level goals, but we can — as we develop our scenarios — start to add some granularity and complexity to our user stories informing the design further.</p>

<p>For example, returning to the earlier example, from the students’ perspective we might consider the following scenarios:</p>

<ul>
<li>At a base level, the students want to access the slides.</li>
<li>At a slightly more enhanced level, the students might want to be able to annotate the slides, capturing their notes.</li>
<li>Finally, if resources allow it, the students might want to share their notes with their peers, enabling collaborative learning.</li>
</ul>

<p>Scenarios, like the example explored above, enable us to <strong>get a clear picture of differing levels of complexity and design for these accordingly</strong>. They also allow us to get a feel for the flow of users through our design, enabling us to map them out on paper so that we can begin to build a birds’ eye view of the project.</p>

<h3 id="mapping-your-design-flow">Mapping Your Design Flow</h3>

<p>Using your user stories and scenarios as a driver for discussion it’s possible to begin to map pathways through your design at a high level. This process of <strong>user story mapping</strong>, illustrated earlier, helps us to define different user flows.</p>

<p>At this point in the process, <strong>paper is a powerful tool for rapid prototyping</strong>, before moving on to develop more refined storyboards. A low-cost, low-fidelity and fast approach, paper prototyping has many benefits:</p>

<ul>
<li>It’s low cost, allowing you to explore multiple ideas with very little barrier to entry;</li>
<li>It’s low fidelity, which encourages you to focus on the big picture and not get lost in the details;</li>
<li>It’s fast, enabling you to quickly iterate through multiple variations of a flow.</li>
</ul>

<p>Paper also enables collaboration, <strong>allowing multiple participants to get around a table and develop a design quickly</strong>, taking on board everyone’s opinions and insights.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b03b1297-2dbf-40f6-81b9-e197a4edba1a/ux-3-paper-prototyping-opt.jpg"
			
			sizes="100vw"
			alt="Paper is a powerful tool for early prototyping phases. Low cost and low fidelity it helps you to focus on the ‘big picture’ and get the skeleton of your design in place."
		/>
    

  
    <figcaption class="op-vertical-bottom">
      Paper is a powerful tool for early prototyping phases. Low cost and low fidelity it helps you to focus on the ‘big picture’ and get the skeleton of your design in place.
    </figcaption>
  
</figure>

<p>Lastly, paper ‘saves itself.’ When we design on screens, we often lose design artifacts due to the nature of software saving ‘states,’ different points in the design process. Paper prototyping allows us to see the entirety of the design process including rejected ideas en route to our finished concept.</p>

<p>In my experience, a typical project will often require multiple rounds of paper prototypes as you iteratively work your way through your thinking. At this point in the process working on screen is too slow and too refined, which can quickly lead to getting lost in needless detail. <strong>Paper frees you up to focus on the big picture</strong>, which is what matters at this stage.</p>

<p>Of course, even experienced designers can recoil when confronted with the idea of sketching interfaces, finding the process intimidating. It’s not uncommon to hear, “But, I can’t draw!” This is patently untrue, all of us were able to draw just fine when we were children (as all those pictures on our parents’ fridges attested!) we just need to re-learn this valuable skill.</p>

<p>To paraphrase Jason Santa Maria:</p>

<blockquote>"Sketching isn’t about being a good artist, it’s about being a good thinker."</blockquote>

<p>With high-level sketches established it’s time to start adding some fidelity by creating some storyboards and wireframes. Hold that thought. However, I’ll return to it in my sixth article on Wireframing and Prototyping.</p>

<h2 id="a-spot-of-science-ux-laws">A Spot Of Science: UX Laws</h2>

<p>UX might be a relatively new discipline, but it’s informed by decades of research within the field of Human Computer Interaction (HCI).</p>

<p>As I noted in the first article in this series, on <a href="https://www.smashingmagazine.com/2017/12/evolution-user-experience/">The Evolution Of User Experience Design</a>, <strong>we are above all designing for humans</strong>, and humans broadly share similar characteristics that we should factor in when we make our design decisions. HCI offers us numerous principles that we can apply to the field of user experience design.</p>

<p>Many of these principles have been distilled down in the form of ‘laws’ that we can draw from, for example:</p>

<ul>
<li>Hick’s Law, which stresses the need to <strong>minimize choices to ease cognitive burden and help drive decision-making</strong>;</li>
<li>Fitt’s Law, which provides valuable advice on how we can <strong>ease interactions through the careful sizing and positioning of interface elements</strong>; and</li>
<li>Miller’s Law, which emphasizes <strong>the benefits of ‘chunking’ to ease complex tasks</strong>.</li>
</ul>

<p>These are principles that can be applied at both the macro- and micro- level and to improve as a designer they are well worth exploring in depth. I’ll explore three — Hick’s Law, Fitt’s Law, and Miller’s Law — but there are many more.</p>

<p>Jon Yablonski’s excellent site, <a href="https://lawsofux.com">Laws of UX</a>, is a helpful collection of principles, which is well worth bookmarking. Not only is a lovely piece of design in and of itself, but it also provides a good overview of each principle accompanied by links to further reading.</p>

<div class="partners__lead-place"></div>

<h3 id="hick-s-law">Hick’s Law</h3>

<p>Hick’s Law (or, in full, the Hick-Hyman Law) states:</p>

<blockquote>"The time it takes to make a decision increases with the number and complexity of choices."</blockquote>

<p>Named after William Edmund Hick and Ray Hyman, a pair of psychologists, the law stresses the importance of <strong>reducing the number of choices you present a user with</strong>.</p>

<p>You might think you’re helping your user by offering an endless series of choices, but in reality, you’re adding to their cognitive burden. The more choices a user is confronted with, the more likely they are to walk away, crippled by ‘<strong>decision paralysis</strong>.’ This can be particularly problematic in an e-commerce context, where users walking away leads to a direct impact on the bottom line.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/17770c1d-04f2-4ee2-820c-7e3e4a636499/ux-5-hicks-law-opt.png"
			
			sizes="100vw"
			alt="A Book Apart features just recent releases"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      Rather than list every single book on its home page, <a href='https://abookapart.com/'>A Book Apart</a> features just recent releases, reducing the number of choices and alleviating decision paralysis. The entire library is just a click away for those looking for a particular book.
    </figcaption>
  
</figure>

<p>We can apply Hick’s Law to UX design in a variety of ways:</p>

<ul>
<li>When creating navigation <strong>instead of providing an endless list of choices, focus on just a few</strong>. Your users will thank you.</li>
<li>In an e-commerce context, instead of listing every single product, reduce the number of choices and focus. Do this, and <strong>you’ll offset decision paralysis leading to higher conversion rate</strong>.</li>
<li>Distinguish essential content from secondary content. By enabling users to find a path through fewer choices, <strong>you’ll reduce their cognitive burden</strong>.</li>
</ul>

<p>We’re often guilty of equating ‘more’ with ‘better,’ but Hick’s Law tells us to think otherwise. The greater the number of options, the longer it takes our users to reach a decision (and sometimes leads them to making no decision). Focus is what matters, not least in a world increasingly overwhelmed with choice.</p>

<h3 id="fitt-s-law">Fitt’s Law</h3>

<p>Fitt’s Law states: The time it takes to acquire a target is a function of the distance to and size of the target. Translated that means: The farther away a target is — a button on a screen, for example — the larger it needs to be for a user to be able to reach it easily.</p>

<p>Fitt’s Law is particularly important when it comes to designing buttons and other clickable onscreen elements. Different contexts require different approaches and will inform your design approach.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/722cf93a-6d9e-40e0-a481-4e72ac89d9ca/ux-6-fitts-law-opt.png"
			
			sizes="100vw"
			alt="Intercom ensures that call-to-action buttons are large and eye-catching"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      On its homepage, <a href='https://intercom.com'>Intercom</a> ensures that call-to-action buttons are large and eye-catching so that they’re both easy to see and navigate to.
    </figcaption>
  
</figure>

<p>In a desktop context a user will be using a mouse and — on a large screen — traversing potentially large distances. In this context, it’s important to <strong>ensure your call-to-action buttons (CTA) are reasonably sized, easy to see and to click on</strong>.</p>

<p>In a mobile context, it&rsquo;s critical to consider tap targets when designing interfaces. When <a href="https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/">designing for touchscreens</a>, our fingers are lower fidelity than mouse pointers, so <strong>we need to increase our tap target sizes</strong>. (Of course, larger tap targets in desktop environments can help, too!)</p>

<p>We can apply Fitt’s Law to UX design in a variety of ways:</p>

<ul>
<li>When designing for mobile, consider your tap targets. With less screen real estate <strong>reduce the number of clickable elements and increase their size</strong>.</li>
<li>It might sound obvious, but <strong>if you have a large button on screen, ensure it’s the primary call to action</strong> otherwise you run the risk of users clicking it inadvertently.</li>
<li>When designing drop-down menus or other forms of nested navigation, <strong>ensure your target sizes are large enough for users to acquire</strong>.</li>
</ul>

<p>Generally speaking, the further away something is the larger it needs to be in order for a user to hit it. When planning out your design at a high level consider important calls to action and ensure you’ve taken on board Fitt’s Law when designing these. Tiny buttons might look neat and tidy, but if they frustrate your user, your design needs work.</p>

<h3 id="miller-s-law">Miller’s Law</h3>

<p>Miller’s Law states: The average person can only keep seven (plus or minus two) items in their working memory. In short: there&rsquo;s only so much we can hold in our heads in a short space of time.</p>

<p>Miller’s law is particularly important when we consider how we organize and group information, and is where chunking can come in useful. Consider the formatting of the following two phone numbers (both the same, fictional number):</p>

<ul>
<li>07700984964</li>
<li>07700 984 964</li>
</ul>

<p>As a string of digits without spacing, an eleven digit number is difficult for a user to hold in working memory. Add some spacing, however, and your users’ task is considerably eased. By chunking the information, your user can retain the three groups of numbers in working memory, enabling them to complete their task.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/043854c6-a27a-480d-ae64-970adca65646/ux-7-millers-law-opt.png"
			
			sizes="100vw"
			alt="helping users when entering their card number and details"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      When entering your credit card details at <a href='https://gumroad.com/l/pilotbundle'>Gumroad</a> spaces are added, chunking your credit card digits into groups of four. This helps users when they’re entering their card number and whether they have entered the correct card details.
    </figcaption>
  
</figure>

<p>Miller’s Law goes further than easing micro-interactions like this; it can also be used at a more macro scale. For example, <strong>when designing forms, focus on chunking information into logically organized groups</strong>: name, address and contact details; account details, like usernames and passwords; bank details; and other groupings.</p>

<p>We can apply Miller’s Law to UX design in a variety of ways:</p>

<ul>
<li>When listing telephone numbers <strong>chunk the information so that it can be held easily in working memory</strong>.</li>
<li>When designing payment forms that feature credit card information, a credit card number will be easier to parse by users if it’s broken into four chunks of four.</li>
<li><strong>Reduce cognitive load</strong> by limiting the number of choices on offer.</li>
</ul>

<p>As designers, we often have to present complex information. Miller’s Law is useful to keep in mind in this context. Where possible look for groups of information that can be broken down and chunked, enabling them to be held more easily in users’ working memory.</p>

<h2 id="look-and-feel-communicating-visual-design">Look And Feel: Communicating Visual Design</h2>

<p>With a bird&rsquo;s eye view of your project’s flow established, it’s important to start to think about its look and feel, as well as its visual design. This is what I call ‘visual grammar,’ and it’s the visual approach you’ll be adopting in your design.</p>

<p>With an ever-increasing proliferation of devices to design for — watches, phones (from small to large), tablets, desktops and other media — the idea of developing a single pixel perfect visual has become dated.</p>

<p>In response to this changing landscape, we’ve seen a move towards design artifacts that move away from pixel perfection in favor of capturing the ‘flavour’ of a design. These artifacts include, for example:</p>

<ul>
<li>Mood Boards</li>
<li>Style Tiles</li>
<li>Element Collages</li>
</ul>

<p>Everyone’s process is different, but at this stage in the process, I use a combination of mood boards and element collages to help to establish direction: <strong>mood boards help you to get into the right ballpark</strong>, element collages act as a bridge between your visual design and your user interface design.</p>

<h3 id="moodboarding">Moodboarding</h3>

<p>Moodboarding, as its name implies, establishes the mood, helping you to zone in on a particular look and feel that fits your overall goal. Mood boards are useful as conversation starters, acting as a focus around which you can build. As a rule of thumb, I usually put together between three and five different mood boards, each signposting different directions.</p>

<p>You might have a particular look and feel in mind, but — as we all know, all too well, I’m sure — your preferred option might not match your client’s point of view. I find it helps to have alternatives and often find the end result drawing together different elements from different mood boards.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3f1ce4a3-3b76-4e83-8afb-79c07d1a5bea/ux-8-moodboard-opt.png"
			
			sizes="100vw"
			alt="mood boards on the Tiny Books website"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      When developing the mood boards for <a href='http://tinybooks.org/'>Tiny Books</a> I adopted both analog (left) and digital (right) approaches. My digital mood boards helped to provide direction to Vic Bell who graciously developed the site’s branding.
    </figcaption>
  
</figure>

<p>The bottom line: At this stage you’re presenting a high-level visual design, <strong>not getting lost creating pixel-perfect designs</strong>, which are futile in an age of widely differing screen sizes. Detailed mockups will follow at the wireframing and prototyping stage.</p>

<p>This point in the process is about developing design artifacts that can be used to spark conversations. To drive that creative discussion <strong>it helps to have a variety of different mood boards</strong> — each with a different look and feel.</p>

<p>When putting together mood boards, it’s important to <strong>consider analog approaches as well as digital approaches</strong>. If your visual inspiration is 100% digital, you run the risk of what I call <em>everythinglooksthesameness</em> where one design looks exactly like another. Consider looking beyond the screen for inspiration, using old unwanted magazines for inspiration, do so, and your designs will stand out.</p>

<h3 id="element-collages">Element Collages</h3>

<p>With feedback gathered on your mood boards, it’s time to start developing some design components, applying your visual direction to some typical user interface elements so that you can settle on a ‘visual grammar.’</p>

<p>There are a number of tools you can use to do this including <a href="https://styletil.es">Style Tiles</a> and <a href="https://v3.danmall.com/articles/rif-element-collages/">Element Collages</a>. Both have their strengths, primarily acting as catalysts for edging towards a finished look and feel.</p>

<p>As Samantha Warren, who developed the Style Tiles methodology, puts it:</p>

<blockquote>"Style Tiles are a catalyst for discussions around the preferences and goals of the client."</blockquote>

<p>This emphasis — on having a discussion about look and feel — is the strength of these two methods. They save a considerable amount of time, removing the need at this stage to create pixel-perfect renderings at multiple sizes.</p>

<p>In my experience, Style Tiles can be misread by clients who mistakenly think they’re visual mockups. I prefer a more freeform, less template-based approach, and when I discovered Dan Mall’s Element Collage approach, I was hooked.</p>














<figure class="
  
  
  ">
  
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/41b8fa7a-77f6-41bd-8fe3-a1b2020b48b4/ux-9-element-collage-opt.png"
			
			sizes="100vw"
			alt="Element Collages by Dan Mall for Reading Is Fundamental"
		/>
    

  
    <figcaption class="op-vertical-bottom">
      Element Collages — like this one by Dan Mall for <a href='https://www.rif.org/'>Reading Is Fundamental</a> — are helpful for capturing a variety of different visual elements and kickstarting a conversation around a potential design direction.
    </figcaption>
  
</figure>

<p>In an excellent post detailing <a href="https://v3.danmall.com/articles/rif-element-collages/">his design process</a> on a project for <em>Reading Is Fundamental</em>, Mall stresses the need to replace presentations with conversations, getting the client involved in the process. Element Collages are an excellent way of driving this conversational approach. As Mall puts it:</p>

<blockquote>"When talking about design with my clients, I like to have as much visual fodder as I can, in order to ensure we’re talking about the same thing. My version of Style Tiles integrates my love of collaging for a different type of execution I call an ‘Element Collage.’ That particular phrase creates an expectation that what we’re looking at isn’t a final design but rather an assembly of disparate pieces without specific logic or order."</blockquote>

<p>The beauty of Element Collages is that they act as a bridge between your mood boards and your (soon to be developed) UI components. They’re flexible enough to show clients to <strong>establish a feel for what we’ll be building</strong>. Above all, they’re a useful tool for helping you to gain consensus around your visual grammar before you start to develop more time-intensive prototypes.</p>

<h2 id="in-closing">In Closing</h2>

<p>Before we get down to the details of user interface (UI) design and building interactive prototypes, it’s important to get the high-level flow of the design in place, establishing a skeleton around which we can build our design.</p>

<p>By establishing a high-level process to kick off the design phase of your projects you can work more efficiently to get a clear framework in place. At this stage in the process, it’s important not to get lost in the details, but rather to focus on getting the broad brushstrokes in place.</p>

<p>It’s important to get the broad brushstrokes right before diving deeper into designing UI and developing wireframes and prototypes. <strong>Focus on establishing a clear design direction, and some clear user goals</strong>, before getting into the details. Resisting the urge to focus on details without clear design goals established saves wasted work.</p>

<p>In short, don’t get lost in the detail until you have everything mapped out.</p>

<h3 id="suggested-reading">Suggested Reading</h3>

<p>There are many great publications — offline and online — that will help you on your adventure. I’ve included a few below to start you on your journey.</p>

<ul>
<li>&ldquo;<a href="https://www.uxpin.com/studio/blog/write-smarter-user-stories-product-design-development/">How to Write Smarter User Stories</a>,&rdquo; Joe Natoli<br />
If you’re already familiar with user stories, I’d recommend reading Natoli’s suggested enhancements to user stories — by adding a focus on measurable benefits — are an interesting take.</li>
<li>&ldquo;<a href="https://www.mountaingoatsoftware.com/agile/user-stories">User Stories</a>,&rdquo; Mountain Goat Software<br />
This guide provides helpful advice on splitting user stories into a series of smaller, connected stories and adding ‘conditions of satisfaction,’ which are worth considering.</li>
<li>&ldquo;<a href="https://lawsofux.com">Laws of UX</a>,&rdquo; Jon Yablonski<br />
An excellent site with helpful collection of principles that is well worth bookmarking. Not only is a lovely piece of design in and of itself, it also provides a good overview of each principle accompanied by links to further reading.</li>
<li>&ldquo;<a href="https://www.nngroup.com/topic/psychology-and-ux/">Psychology and UX</a>,&rdquo; Nielsen Norman Group<br />
With a firm grounding in the different laws that can be applied within the field of user experience, I’d recommend exploring psychology, too.</li>
<li>&ldquo;<a href="https://v3.danmall.com/articles/rif-element-collages/">Element Collages</a>,&rdquo; Dan Mall<br />
This is well worth reading if you want to gain an understanding of how these tools can be used in the service of typical client projects.</li>
</ul>

<p><em>This article is part of the UX design series sponsored by Adobe. Adobe XD is made for a fast and fluid UX design process, as it lets you go from idea to prototype faster. Design, prototype, and share — all in one app. You can check out more inspiring projects created with Adobe XD on Behance and also sign up for the Adobe experience design newsletter to stay updated and informed on the latest trends and insights for UX/UI design.</em></p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2024/02/accessibility-standards-empower-better-chart-visual-design/">How Accessibility Standards Can Empower Better Chart Visual Design</a></li>
<li><a href="https://www.smashingmagazine.com/2023/08/improving-double-diamond-design-process/">Improving The Double Diamond Design Process</a></li>
<li><a href="https://www.smashingmagazine.com/2023/10/ux-research-learn-from-lt-columbo/">Everything I Know About UX Research I First Learned From Lt. Columbo</a></li>
<li><a href="https://www.smashingmagazine.com/2023/07/writing-css-2023/">Writing CSS In 2023: Is It Any Different Than A Few Years Ago?</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(ra, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Eduard Khorkov</author><title>From Idea To Development: How To Write Mobile Application Requirements That Work</title><link>https://www.smashingmagazine.com/2017/05/writing-mobile-application-requirements/</link><pubDate>Mon, 08 May 2017 20:48:43 +0000</pubDate><guid>https://www.smashingmagazine.com/2017/05/writing-mobile-application-requirements/</guid><description>Generally speaking, writing a requirements document is mostly about conveying your vision to the rest of the team. In this article, Eduard Khorkov will outline the most common approaches to writing requirements documents. You will learn the basic steps of writing mobile application requirements and what a good requirements document looks like. Eduard will create two documents: a PDF with user stories and wireframes, and a screen map that complements the PDF. Together, they describe in detail what features the application should have.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2017/05/writing-mobile-application-requirements/" />
              <title>From Idea To Development: How To Write Mobile Application Requirements That Work</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>From Idea To Development: How To Write Mobile Application Requirements That Work</h1>
                  
                    
                    <address>Eduard Khorkov</address>
                  
                  <time datetime="2017-05-08T20:48:43&#43;00:00" class="op-published">2017-05-08T20:48:43+00:00</time>
                  <time datetime="2017-05-08T20:48:43&#43;00:00" class="op-modified">2025-10-14T04:02:41+00:00</time>
                </header>
                
                

<p>Why write requirements? Well, let’s imagine you want to produce a mobile app, but you don’t have the programming skills. So, you find a developer who can build the app for you, and you describe the idea to him. Surprisingly, when he showcases the app for the first time, you see that it is not exactly what you want. Why? Because you didn’t provide enough detail when describing the idea.</p>

<p>To prevent this from happening, you need to formalize the idea, shape it into something less vague. The best way to do that is to write a requirements document and share it with the developer. A requirements document describes <strong>how you see the result of the development process</strong>, thus making sure that you and the developer are on the same page.</p>

<p>In this article, we will outline the most common approaches to writing requirements documents. You will learn the basic steps of writing mobile application requirements and what a good requirements document looks like.</p></p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/typescript-in-50-lessons/">“TypeScript in 50 Lessons”</a></strong>, our shiny new guide to TypeScript. With detailed <strong>code walkthroughs</strong>, hands-on examples and common gotchas. For developers who know enough <strong>JavaScript</strong> to be dangerous.</p>
<a data-instant href="/printed-books/typescript-in-50-lessons/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="/printed-books/typescript-in-50-lessons/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/2732dfe9-e1ee-41c3-871a-6252aeda741c/typescript-panel.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="how-to-approach-the-writing">How To Approach The Writing</h2>

<p>A carefully crafted requirements document eliminates ambiguity, thus ensuring that the developer does exactly what needs to be done. In addition, the document gives a clear picture of the scope of the work, enabling the developer to better assess the time and effort required. But how do we create a good document? Below are some tips that our mobile team at <a href="https://www.ipolecat.com/">Polecat</a> follows when crafting requirements.</p></p>

<h3 id="1-describe-the-idea-in-general">1. Describe The Idea In General</h3>

<p>We believe that a proper description of the idea should fit in one sentence. The sentence may include a core feature of the application, so that the reader understands instantly what the app is about. For a calorie-tracking mobile application, it could be, “An app to track calorie consumption to help those who care about their weight.”</p>

<p><strong>Hint:</strong> Gua Tabidze shares a <a href="https://medium.com/@gtabidze/describe-your-idea-framework-2bfca3dc6ec9#.71ds2q58r">few models that others use</a> to describe an idea.</p></p>

<h3 id="2-consider-the-sequence">2. Consider The Sequence</h3>

<p>Study <a href="https://developer.apple.com/design/human-interface-guidelines/navigation-and-search">basic navigation patterns</a>, and describe your application in the same sequence that users would experience while exploring it. Once the idea part is done, describe the first steps of the application, such as the onboarding screens and user registration.</p>

<p>Then, move on to what goes next, such as the application’s home screen. This approach will give the reader a sense of what the user’s journey would look like.</p>

<p>At the end, don’t forget about basic features and screens such as the privacy policy and the “forgot password” feature.</p></p>

<h3 id="3-review-existing-applications-in-the-stores">3. Review Existing Applications In The Stores</h3>

<p>Review existing applications in Apple’s App Store and Google Play, and refer to them when describing your app. If you like how the “forgot password” feature works in applications A and B, put it in the requirements document.</p></p>

<h3 id="4-abstract-away-from-detail">4. Abstract Away From Detail</h3>

<p>Focus on the features of the application, and skip details such as the color of a button. Most app users do not care about such details. What they do care about is whether your application helps to solve their problem. So, when writing requirements, concentrate on things that the user should be able to do in the app.</p></p>

<h3 id="5-prioritize-features">5. Prioritize Features</h3>

<p>Convey which features are more important than others, so that the developer knows what to focus on first. We usually follow the <a href="https://en.wikipedia.org/wiki/MoSCoW_method">MoSCoW method</a>, marking items with “Must,” “Should,” “Could” and “Won’t” levels of priority.</p>

<h3 id="6-complement-text-with-wireframes">6. Complement Text With Wireframes</h3>

<p>Create wireframes of the screens of the application to accompany your textual description of them. If you have more than four wireframe screens, then drawing a screen map makes sense. We’ll show a screen map later in this article.</p></p>

<h2 id="requirements-formats">Requirements Formats</h2>

<p>Now that you know how to write the requirements, you’ll need to choose an appropriate format for the document. There are a few basic formats for writing the requirements for a mobile app, such as a functional specification document (FSD), user stories and wireframes.</p></p>

<h3 id="functional-specification-document">Functional Specification Document</h3>

<p>An <a href="https://en.wikipedia.org/wiki/Functional_specification">FSD</a> is probably the default format in the software development industry. It consists of a standard list of items that cover what the product should do and how it should do it.</p>

<p>Let’s take a simple calculator application and describe its features as an FSD:</p>

<ul>
<li>Application screen presents a digital keyboard with additional buttons for basic arithmetic operations (addition, subtraction, multiplication, division) and a result button (marked with “=”).</li>
<li>Tapping on a digit button adds it to the display section of the screen. Each new digit is added to the right side of the number.</li>
<li>Tapping on an operation button causes the current number shown in the display section to be added to the memory. It also clears the display section for the next number.</li>
<li>Tapping on the display-result button combines the number in memory with the one in the display section according to the operation requested previously. The resulting number is shown in the display section of the screen.</li>
</ul>

<p>As you can see, this format requires quite a detailed description of the product because the description will be used by both the business and the developers. It ensures that all participants are on the same page.</p>

<p>The person who composes the FSD should have strong experience in software development and should know the specifics of the mobile or other platform for which you are building. Also, because of the high level of detail required, creating and polishing such a document usually takes a decent amount of time.</p></p>

<h3 id="user-stories">User Stories</h3>

<p>A <a href="https://en.wikipedia.org/wiki/User_story">user story</a> is less formal than an FSD yet still very powerful. It lists the things that the user can do in the application and is described from the user’s perspective. The document could also briefly explain why the user would want to do it, if that’s not obvious.</p>

<p>Let’s take our calculator example and add a few other features, describing them as a user story:</p>

<ul>
<li>As a user, I want to be able to change the number notation from decimal to exponential (and vice versa), so that I can work with very small or very large numbers.</li>
<li>As a user, I want to be able to export a calculation’s history as a PDF file to share with my colleagues.</li>
</ul>

<p>Because of the explanation, such a format provides not only a technical overview of the requirements, but also a good business case for them. Thus, if a feature is identified that is not critical to the business, you could decide either to completely remove it from the scope or to postpone it to a future release.</p>

<p>Using this format, you can easily split one story into multiple sub-stories to provide more detail. For example, we could split the PDF-exporting story into the following sub-stories:</p>

<ul>
<li>As a user, I want to be able to tap on the sharing button (top right of the screen) to see my options (sharing as PDF, text, image).</li>
<li>Once I select a sharing option, I want to select the calculation timeframe that will be shared, using <a href="https://developer.apple.com/design/human-interface-guidelines/pickers/">iOS’ date picker</a>.</li>
</ul>

<p>Because of the simplicity and non-technical nature of user stories, in most cases, a manager cannot simply ask a developer to implement a particular user story. Turning a story into a task that can be added to a task tracker requires further discussion and detailing between the manager and technical leader.</p>

<p>User stories have become one of the most convenient and popular formats because of their simplicity and flexibility.</p></p>

<div class="partners__lead-place"></div>

<h3 id="sketches-and-wireframes">Sketches And Wireframes</h3>

<p>Another way to outline an application’s requirements is to visualize them in sketches or wireframes. With iOS development, around 70% of development time is spent on interface implementation, so having all of the screens in front of you would give you a good sense of what needs to be done and the scope of the work.</p></p>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/7dc2eb18-9772-40d1-965a-526bf8529afb/1-calculator-mockup-preview-opt.png"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/7dc2eb18-9772-40d1-965a-526bf8529afb/1-calculator-mockup-preview-opt.png" alt="Calculator wireframe example" width="380" height="" /></a><figcaption>Calculator wireframe example created in <a href="https://balsamiq.com" rel="nofollow">Balsamiq Mockups</a>.</figcaption></figure>

<p>Creating a relevant set of wireframes for a mobile application requires you to know the basics of the user experience: how screens can be linked with each other, which states each screen can have, and how the application will behave when it is opened from a push notification.</p></p>

<h3 id="mixing-formats">Mixing Formats</h3>

<p>Don’t be afraid to mix formats. By doing this properly, you <strong>take advantage of the strengths of each format</strong>. In our experience, mixing user stories and wireframes makes the most sense. While the user stories describe the features of the application and provide a business case for them, the wireframes show how these features would appear on the screens of the app. In addition, putting together user stories and wireframes would take you less time than writing an FSD, with all of its accompanying detail and descriptions of the interactions.</p>

<p>Start by sketching out wireframes for the application. Once the wireframes are done, add two or more user stories for each screen, describing what the user can do on that screen. We’ve found this approach to be the most appropriate for mobile application development, so we use it a lot.</p></p>

<h2 id="let-s-practice">Let’s Practice</h2>

<p>I’ll take our What I Eat application as an example. I’ll compose the requirements document as if we were developing the application from scratch.</p>

<p>First, let’s formalize the idea using <a href="https://medium.com/@gtabidze/describe-your-idea-framework-2bfca3dc6ec9#.71ds2q58r">Steve Blank’s XYZ pattern:</a> “We help X do Y by doing Z.” The premise of the application is to enable users to take control of what they eat during the day and of their calorie intake. According to the XYZ method: “What I Eat helps those who care about their weight to track calorie consumption by providing functionality for a simple meal log.”</p>

<p>As mentioned, mixing user stories and wireframes works best for us, so why not use them here?</p>

<p>The next step is to describe the What I Eat app as user stories, screen by screen. We’ll begin with the application’s start and home screen:</p>

<ul>
<li>As a user, I want to open the app and instantly see today’s meal log and the calories consumed.</li>
<li>I want to be able to quickly add new meals and calories that I’ve just consumed.</li>
<li>I also want quick access to the in-app calendar to view my meal logs from previous days.</li>
</ul>

<p>To avoid any ambiguity, we’ll create a wireframe for this screen.</p></p>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/22d32b79-aceb-4ace-a6c3-d49d50cb2f90/4-wie-home-screen-preview-opt.png"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/22d32b79-aceb-4ace-a6c3-d49d50cb2f90/4-wie-home-screen-preview-opt.png" alt="Home screen wireframe" width="380" height="" /></a><figcaption>Home screen wireframe</figcaption></figure>

<p>As you can see, we weren’t able to put the “Add new meal” functionality on the home screen. Instead, we added a button to navigate to another screen that presents this feature. Now, we need to put together user stories for this new screen:</p>

<ul>
<li>I want to type in the name of the meal I’ve just had.</li>
<li>Along with the name of the meal, I want to enter the number of calories.</p></li>
</ul>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d9303884-cd11-4e5b-86b7-8e6a9b7ddac3/2-wie-add-meal-preview-opt.png"><img class="" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d9303884-cd11-4e5b-86b7-8e6a9b7ddac3/2-wie-add-meal-preview-opt.png" alt="Wireframe for add meal screen" width="380" height="754" /></a><figcaption>Wireframe for add-meal screen</figcaption></figure>

<p>The home screen has a button that opens the calendar. Because there are many other calendar apps, checking their designs first makes sense. We like the iPhone’s default calendar app, so we will use it as a reference.</p>

<ul>
<li>As a user, I want to be able to quickly select a date in the current month.</li>
<li>When selecting a date, I want to see a list of meals for that date below, like in the iPhone’s calendar app.</li>
<li>I want to be able to switch to the next or previous month.</li>
</ul>

<p>We will also put a piece of the iPhone calendar’s user interface in the wireframe.</p></p>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/46bcabd4-879c-4206-9a13-ff51e86eb10f/3-wie-calendar-preview-opt.png"><img class="" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/46bcabd4-879c-4206-9a13-ff51e86eb10f/3-wie-calendar-preview-opt.png" alt="Calendar wireframe" width="380" height="754" /></a><figcaption>Calendar wireframe</figcaption></figure>

<p>Finally, we need to add some settings to the app.</p>

<ul>
<li>I want to be able to enable and disable iCloud backups for my meal records.</li>
<li>I want to be able to enable and disable daily push notifications that remind me to track my calorie intake.</p></li>
</ul>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dc64d42e-1419-4663-bff7-b50c29ad9be5/6-wie-settings-preview-opt.png"><img class="" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/dc64d42e-1419-4663-bff7-b50c29ad9be5/6-wie-settings-preview-opt.png" alt="Wireframe of settings screen" width="380" height="754" /></a><figcaption>Wireframe of settings screen</figcaption></figure>

<p>Phew! Almost done. The final step is to put the wireframes and user stories together in one document, with each wireframe and its respective story on its own page.</p></p>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/05039df9-6bd7-42f9-82ab-c08ce3cf646c/7-wireframes-first-page-large-opt.png"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9fff0c66-02c2-455a-8b61-8aa251431b77/7-wireframes-first-page-780w-opt-1.png" alt="Wireframe and user stories" width="780" height="" /></a><figcaption>Wireframe and respective user story on one page. <a href="https://smashingmagazine.com/provide/what-i-eat-full.pdf">Download the full document</a> (PDF, 0.2 MB). (<a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/05039df9-6bd7-42f9-82ab-c08ce3cf646c/7-wireframes-first-page-large-opt.png">View large version</a>)</figcaption></figure>

<p>In addition, we can draw a map to visualize how the screens are connected to each other. We’ll use <a href="https://miro.com/">miro</a> for that.</p></p>

<figure><a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/1ec2a93f-919a-4a5b-bc63-1954a94b5964/5-wie-map-large-opt.png"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/eb2cef42-2514-4429-90fd-206a029bd7c6/5-wie-map-780w-opt.png" alt="Screen map for calorie-tracking iPhone application" width="780" height="870" /></a><figcaption>Screen map for calorie-tracking iPhone application (<a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/1ec2a93f-919a-4a5b-bc63-1954a94b5964/5-wie-map-large-opt.png">View large version</a>)</figcaption></figure>

<p>In doing the screen map, we realize that there is no button to go to the settings screen, so we’ll add that to the home screen.</p></p>

<h2 id="conclusion">Conclusion</h2>

<p>We have created two documents: a PDF with user stories and wireframes, and a screen map that complements the PDF. Together, they describe in detail what features the application should have. We can go ahead and send that to our developer. This time, the application he delivers will correlate with your vision.</p>

<p>Generally speaking, writing a requirements document is mostly about conveying your vision to the rest of the team. Don’t limit yourself to the methodology described above. Feel free to experiment and find the solution that works best for you.</p></p>

<h3 id="resources">Resources</h3>

<p>Delve deeper into the subject with the following resources:</p>

<ul>
<li><a href="https://agileforall.com/wp-content/uploads/2009/10/Story-Splitting-Cheat-Sheet.pdf">Story Splitting Cheat Sheet</a> (PDF, 0.25 MB)</li>
<li><a href="https://www.romanpichler.com/blog/10-tips-writing-good-user-stories/">10 Tips for Writing Good User Stories</a>, Roman Pichler</li>
<li><a href="https://www.smashingmagazine.com/2016/11/wireframe-perfectionist-guide/">The Wireframe Perfectionist’s Guide</a>, Edric Lapniramai, Smashing Magazine</li>
<li><a href="https://blog.intercom.com/using-job-stories-design-features-ui-ux/">Designing Features Using Job Stories</a>, Alan Klement, Intercom</li>
</ul>

<p>We’d love to hear about your approach to creating requirements documents. Please share your thoughts in the comments.</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2016/11/what-everyone-should-know-about-the-process-behind-app-design/">What You Should Know About The App Design Process</a></li>
<li><a href="https://www.smashingmagazine.com/2013/03/creating-wireframes-and-prototypes-with-indesign/">Creating Wireframes And Prototypes With InDesign</a></li>
<li><a href="https://www.smashingmagazine.com/2014/10/the-skeptics-guide-to-low-fidelity-prototyping/">The Skeptic’s Guide To Low-Fidelity Prototyping</a></li>
<li><a href="https://www.smashingmagazine.com/2012/09/free-download-ux-sketching-wireframing-templates-mobile/">UX Sketching And Wireframing Templates For Mobile Projects (Free Download)</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(da, vf, yk, al, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item></channel></rss>