<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>PJ Onori’s blog</title>
        <link>https://pjonori.blog</link>
        <description></description>
        <lastBuildDate>Thu, 07 May 2026 16:50:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved 2024, PJ Onori</copyright>
        <category>Software design</category>
        <item>
            <title><![CDATA[Testing agents on design systems]]></title>
            <link>/posts/testing-agents-on-design-systems</link>
            <guid isPermaLink="false">/posts/testing-agents-on-design-systems</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[It’s really easy to say agents are able to use a design system. It’s another thing to prove it.]]></description>
            <content:encoded><![CDATA[<p>Look, I’m no AI expert. Meaning I have at least one thing in common with 99.9% of AI “experts” on LinkedIn. What I do know is that more and more people are using agents to make software. Meaning a design system needs to play nice with them.  </p>
<p>It’s really easy to say agents are able to use a design system. See, I just said it–that’s how easy it is. It’s another thing to show that agents are able it use it <em>well</em>–with receipts to prove it.</p>
<p>Now, don’t get all excited–I haven’t done that. But what I’ve done is built a tool that’s helping us get there. And, as much as it doesn’t benefit me to say this, it’s not rocket science. </p>
<p>So, I don’t want anyone to get it twisted that I’m touting this as some ground breaking innovation. I mentioned this offhand in a thread and people asked for me to share more. So, here we are. </p>
<h2>How it works, basically</h2>
<p>I’m not a smart guy–to my benefit. Being not smart, I don’t try to get fancy. So, when pondering on this problem, I landed on something very not fancy. </p>
<p>Two groups of agents get spun up, and both are given the same prompt to make an interface. One group’s given the old design system. The other is given our new one. </p>
<p>Each agent provides feedback on problems faced after it’s done. Once all agents finish, the builds are evaluated on a bunch of crap and a report is generated. </p>
<p>That’s it. Like I said, <em>not</em> rocket science.</p>
<h2>How it works, in gory(ish) detail</h2>
<p>OK, I’ll admit there’s more that goes into this. I wouldn’t say it’s important to know unless you want to replicate this. </p>
<p>The tool is relatively configurable. I don’t know what I’m doing, so I need to turn knobs and levers.</p>
<ul>
<li>You can choose how many agents get spun up per group. I typically go with three per group–mainly because three is an awesome number.</li>
<li>The model is also configurable. It only supports Claude models, for a number of reasons. But there’s nothing technically stopping it from using other providers.</li>
<li>There’s a flag for accessing training through a static markdown file or MCP. The results are pretty dramatically different. I’m still working out why.</li>
<li>It allows you to add your own prompt to test from or let Robot Jesus to take the wheel. In that case, the prompt is created by an agent-generated in PRD format.</li>
</ul>
<p>All agents are run independently to avoid sharing context. That’s obviously pretty important. Each agent is instructed to confirm that the app builds and runs. If an error occurs, the error message is logged and the agent is prompted to fix. They get a finite number of chances before being told to sit in a corner and feel bad. That feature avoids the nightmare “4,568th time’s a charm” scenario along with the $10,000 bill.</p>
<p>Each test is locally stored and self contained.  Below is basic directory structure, with different names to (hopefully) be clearer.</p>
<pre><code>test/
├── old/ 
│   ├── agent-1/
│   ├── agent-2/
│   ├── agent-n/
└── new/ 
    ├── agent-1/ 
    ├── agent-2/
    ├── agent-n/
</code></pre>
<p>(No, I didn’t use AI to make that diagram. Yes, it look an embarrassingly long amount of time to make it.)</p>
<p>Agent output (generated code, error messages, screenshots etc.) is stored in its own <code>agent-n</code> folder. It’s basically everything that came out of the work. That’s helpful for when you want to run the code to dig into details. </p>
<p>All analysis happens after all agents finished the work or died trying. The report compiles all the results into group averages. So, the more agents you spin up, the larger the sample size (duh).</p>
<h2>What it measures</h2>
<p>A lot–but there’s still a lot of work to be done. This is what’s  tracked so far: </p>
<ul>
<li><strong>Timing</strong>: How long it takes to complete the task. Ideally, a well-trained agent will be able to get the job done faster.</li>
<li><strong>Lines of code</strong>: How much code did it produce to complete the job. My hope is to see lines of code decrease as we build more high-order components.</li>
<li><strong>Code variance</strong>: How different the code is between each iteration. This measure shows how consistent and predictable code output is across agents.</li>
<li><strong>Fix attempts</strong>: How many times the agent had to go back and fix an error. Ideally, the design system allows agents to one-shot an interface. </li>
<li><strong>Components used</strong>: A breakdown of all the components used, and the amount of time each is used.</li>
<li><strong>Accessibility</strong>: A fairly basic set of axe accessibility tests. At best, the tests are assessing airquote-accessibility. Admittedly not great, but a start.</li>
<li><strong>Performance</strong>: Baseline render time, LCP, FCP, and OPP (that last one isn’t real, but it was a good song)</li>
<li><strong>Inline styles</strong>: Tracks component instances with inline styles.  This one is a legit nightmare–agents love to slap inline styles on pretty much everything.</li>
<li><strong>Visual diff</strong>: Just your run of the mill pixel diffing for each screenshot. This is also used to assess how consistent the output is from agent to agent. </li>
<li><strong>Token usage</strong>: No, not design tokens–the robot kind. Input and output token spend is recorded to measure efficiency. Results should be good–and not break the bank.</li>
<li><strong>Feedback</strong>: Last, but not least, feedback from every agent is added and broken down by general theme.</li>
</ul>
<p>There’s always more to track. Responsive screenshots seems like an obvious one. I’ll be adding more as they are needed.</p>
<h2>How I use the tool</h2>
<p>I’m still learning how to make the most use of this tool. In general, I use a basic flywheel approach. I run tests, collect data, synthesize it, then make improvements. Rinse, repeat. What this process lacks in fanciness, it makes up for in <em>actually working</em>. </p>
<p>Sometimes I approach improvements from a broad spectrum. That usually means combing through agent feedback like API issues, or install woes. Other times, I use it to improve on specific facets. Like the time I went to war on inline style usage. </p>
<p>I’ve gotten in the habit of running a test with a decent number of agents when a new release ships. Sometimes, nothing new shows up. Other times, the test catches bugs, or inconsistencies with documentation. </p>
<p>I also try to run tests when new models come out. To be honest, I should spend more time doing this. </p>
<h2>The results are promising</h2>
<p>But <em>way too early</em> to get giddy about. In a nutshell, every track metric improved. What I find most promising is the consistent trajectory of improvement. Results vary, but they’re not thrashy. </p>
<p>It’s worth noting the tests have only run on Claude 4.5/4.6 models. I still need to give the 4.7 models a spin. I also have zero use on any other providers. So, again, promising, but too early to get cocky.</p>
<h2>What I learned</h2>
<p> Now, I’ll admit–“learned” is doing some heavy lifting. Everyday, people “learn” the world is flat on YouTube. I can’t say what I’ve learned is right. All I can share is where my head’s at based on this experience. Your mileage <em>will</em> vary. </p>
<h3>This isn’t a replacement for talking to people</h3>
<p>OK, confession, I already knew that. But I want to lead with this so people don’t get wild (and stupid) ideas in their heads. This tool won’t save you from having to (god forbid) talk to <em>actual people</em>. Agents are a whole other animal–figuratively. Believe it or not, an <em>agent evaluation tool</em> is used to evaluate <em>agents</em>. </p>
<h3>This can be pretty cheap</h3>
<p>My instructions always explicitly state to only write code for the front-end. And that turns out to be a pretty light lift. Tests with 3 agents per group costs about the same as a cheap coffee. </p>
<h3>Super big sample sizes aren’t super necessary</h3>
<p>Most of the time the results from 3 agents versus 30 look about the same. There are cases where you get that out-of-nowhere result. Those show up more often with a larger set of agents (duh). Those can be helpful because it exposes the edge cases. But the common issues tend to show up with a low number of agents. </p>
<h3>It’s easy to start teaching to the test</h3>
<p>I was using the same template prompt for tests when I first got started. I was making solid progress, but it began to feel <em>too easy</em>. That’s when I added the ability to randomize prompts. And, yeah, all sorts of new crap started popping up. </p>
<p>Randomizing prompts emulates how a design system is used–which is unpredictably. </p>
<h3>Documentation makes a huge difference</h3>
<p>I was starting to question if documentation was making things better. Maybe component improvements was doing the heavy lifting–who knows? So, I ran a couple tests without documentation&#8230; The documentation was <em>clearly</em> the heavy lifter. This seems like a no brainer–but it was important for me to verify. Documentation is essential for systems that agents don’t have a lot of reps with. </p>
<h3>Agents are somehow more stubborn than I am</h3>
<p>Agent muscle memory is a complete pain in the ass. It can be overcome, but it’s going to piss you off the entire way there. Agents often straight-up ignore guidelines. I’ve combatted this with weapons-grade repetition. I’ll often repeat the same damned point five or six times in critical points of the documentation.</p>
<h3>Agents (probably) need their own docs</h3>
<p>Repeating points for agents may be fine, but it can be a pain in the ass for people. I’ve started to add a “For agents” section in the docs. That section is the dumpster for “get it in your silicon head” training. I remain a strong advocate for human-written documentation. But I could care less if documentation for agents is written by agents. As long as people don’t see that content, I’m all for it.</p>
<h3>MCPs are hard</h3>
<p>I’m really struggling with getting good results with MCPs. My best results come from agents getting a big context dump of all documentation. Agents that use the MCP ask all the wrong questions. They make bad assumptions. A lot more tokens get spent for worse results. All I’ve learned so far is that I need to learn more.</p>
<h3>Documentation probably won’t cut it</h3>
<p>Yes, I said documentation makes a big difference. But I don’t think it’s going to be enough. Agents still do dumb things for dumb reasons–or no reason. I’m pretty sure systems will have to ship with linters and other tools to unscrew basic agent stupidity.</p>
<h3>Feedback needs to go through a BS filter</h3>
<p>The feedback part of the analysis is helpful. Make no mistake. But it needs heavy interpretation. A lot of the feedback is half true, or framed on a poor conclusion. There’s usually a nugget of value, but it can take a decent amount of polishing to extract it. </p>
<h3>Don’t let that flywheel spin on its own</h3>
<p>Now, I know what you’re thinking. You&#8217;re think it&#8217;d be great for agents to run the entire flywheel. Have them kick off tests, analyze, and then apply updates to the system. Over and over. </p>
<p>That’s a bad idea. </p>
<p>There’s a lot of noise in the output, feedback, and analysis–otherwise known as <em>everything</em>. That noise compounds <em>fast</em>. Think of the telephone game–then think about what that’d do to a design system.</p>
<h2>I haven’t made something worth sharing</h2>
<p>At least not yet. “Working for me” isn’t <em>actually</em> working. This was made on the company dime and so it’s not even my decision to begin with. And that&#8217;s not even the point. If I can make this, you can too–so go and do it!</p>
<h2>I’m not saying this is the right  way to do this</h2>
<p>I’m saying it’s how <em>my dumb ass</em> did. Just like 99.9% of AI “experts”, I have no idea what I’m doing. But that’s not going to stop me from trying. If I learn something worth sharing, I will. Maybe that’ll be a better way to do this. Maybe it’ll be a cautionary tale against the whole ordeal. Either way, you should give something like this a go. Then you too can join the world’s least exclusive club of AI “experts”.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Don’t talk like them]]></title>
            <link>/posts/dont-talk-like-them</link>
            <guid isPermaLink="false">/posts/dont-talk-like-them</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[It’s important to say things that sound like a human said it.]]></description>
            <content:encoded><![CDATA[<p>I don’t like corporate jargon. No one does. Yet it’s the de facto language of business. It doesn’t surprise me to hear some professions talk like this (not naming names). But it bums me out when I hear designers and engineers do it. It bums me out for a lot of reasons–because it’s not helping anyone. Especially themselves. </p>
<h2>Corporate newspeak sucks</h2>
<p>I’m labeling corporate jargon as <a href="https://www.merriam-webster.com/dictionary/newspeak">newspeak</a>. That word seems like a better fit with every passing day. It’s the language of bullshit. </p>
<p>It’s used as a dog whistle to announce they’re “in the club”–because they aren’t. It’s used to sound credible–without <em>actually</em> having to be. It’s used to sound smart–by people who usually aren’t. It’s used to prop up ideas with fancy words–because they can’t stand on their own. It’s used to filibuster–to fill up space with a lot of words that mean nothing. It’s used to sow confusion–so that they can avoid having to stand behind a message. What sucks the most is that it’s almost <em>always</em> done for the gain of the speaker instead of the audience. </p>
<p>And in an ironic twist of fate, the peddlers of bullshit convinced countless others to adopt it. It’s both universal and non-existent. Every press release and quarterly report is soaked in it. But it&#8217;s nowhere in real human conversations.</p>
<p>I could go on and on about why corporate newspeak sucks. It&#8217;s cathartic, but not helpful. Instead, I’ll spend the rest of this writing about how it doesn&#8217;t need to be like this.</p>
<h2>Doers don&#8217;t need to do this</h2>
<p>Designers and engineers are makers. They’re doers. They don’t need to talk in bullshit. Because they <em>do shit</em>. Now, I&#8217;m under no illusion that designers and engineers are perfect. An encylopedia can be filled with their failings. But both professions are makers. And that holds weight. That doesn&#8217;t mean makers don&#8217;t have to talk about what they make or what they do. At some point, everyone has to explain their thinking, their work, or their value. That can take the form of a portfolio, or a job interview, or a presentation. The trick is not to fall into the trap of speaking bullshit. </p>
<p>So, how does one not bullshit? There’s not one single answer, but this is mine. </p>
<p><strong>First, have something to say.</strong> This is the key point–all else hinges on this. Be selective and critical of what you put out in the world. That, &#8220;something&#8221;, should be intentional, considered, and helpful to others. It’s far better to say nothing if you have nothing to say. Save it for when there’s something worth other’s time. Use that time spent <em>not saying stuff</em> finding something useful to say for you and others.</p>
<p>Yes, <em>The Algorithm ™</em> will argue otherwise. It wants volume. It wants frequency. It wants what helps itself. You do not fit into that picture. Quality is <em>much better</em> than quantity.</p>
<p><strong>Second, say what you mean.</strong> Yes, this means being honest. But it also means to be direct and plain-spoken. Big ideas don’t need big words. Get to the point. </p>
<p>Let’s use the example of design system documentation. A button component <em>could</em> be described as, “The button component constitutes a discrete, interactive user interface element facilitating the initiation of deterministic actions within the application context.” Or it could be, “Buttons let people take actions.” One says, “I take myself way too seriously”. The other describes what a button is. </p>
<p><strong>Third, say it like you’d actually say it.</strong> Write and talk like you <em>actually talk</em>. The things people publish are working double-duty. Their first job is to get the intended point across. But they also open a window into who the person behind the words is. Don&#8217;t undervalue that.</p>
<p>Talking or writing in corporate newspeak sucks the personality out of the message. The same goes for the messenger. Now, someone may be saying, “The way I talk is boring and meandering.” Well, then <em>fix that</em>. “Be yourself” isn’t a call to celebrate mediocracy. Be who you are–while trying to be better. </p>
<p>If you’re not able to describe something in a document or presentation, say it out loud. Hell, <a href="https://www.talktotheduck.blog/talk-to-the-duck/">talk to a rubber duck</a>. Do whatever you need to say things how you&#8217;d actually say them.</p>
<p><strong>Fourth, back it up.</strong> People who describe themselves as visionaries aren’t visionaries. The actual handful of visionaries alive don’t have to say it–because they’ve proven it.</p>
<p>Don’t describe what can be shown. Great work speaks for itself. Yeah, most of us aren’t in that echelon. So, it&#8217;s understandable that us mortals need to add color from time to time. But <em>showing</em> should take center stage.  </p>
<p>A portfolio spending more time describing the work has a problem (I’m looking at you, <a href="https://pjonori.design/work/gestalt/">Gestalt case study</a>). Sometimes you have to puff your chest out a little. But a little goes a long way. Showing the work should do the heavy lifting. Let the audience come to their own conclusion. </p>
<p>The same goes for documentation. Sometimes the best thing to say is <em>nothing at all</em>. Documentation can try to explain a pattern with a wall of text. But it’ll be more effective to let a working demo do the heavy lifting. </p>
<h2>Oh, and AI</h2>
<p>The term, “soulless language” now has a whole other dimension to it. Corporate newspeak is now a basic prompt away.</p>
<blockquote>
<p>Let me be radically transparent with you. There was a season in the zeitgeist when leveraging elevated vernacular signaled intellectual capital. That era? Sunset.<br /><br />
In today&#8217;s landscape, over-indexing on sophisticated terminology is actually a red flag for authenticity debt. Why? Because the playing field has been fundamentally leveled.<br /><br />
Every single individual now has frictionless access to AI-powered linguistic augmentation tools. The prompt &#8220;optimize my lexicon for executive presence&#8221; is literally one click away for anyone ready to uplevel their content game.</p>
</blockquote>
<p>See? Now everyone can sound like an asshole. There was a time when using fancy jargon made someone sound smart. “Rewrite this to use fancier words” is a prompt anyone can type into their agent of choice.  </p>
<p>Sounding like a normal human hasn’t been normal for a while now. AI will only exaggerate this. And let’s be honest–many, <em>many</em> people are leaning on AI for what they say.  </p>
<h2>We can do better</h2>
<p>A lot of people despise writing, speaking, or plain old communication. I get it–we all don&#8217;t like the same thing. Some people feel shaky in their qualifications, or skills to articulate. I get that as well. Defaulting to corporate lingo can feel like a shortcut around those issues. But it&#8217;s going through the motions.</p>
<p>I see it as a missed opportunity. Bullshitters <em>need</em> to bullshit, because that&#8217;s all they have. Doers don&#8217;t need to bullshit. Not only that–doing so harms the standing that comes with being a doer. Writing and/or speaking may not be your thing. But for skilled doers, the hardest work is already done. The work <em>of the work</em>. The reward of doing the work is not having to rely on bullshit. </p>
<p>It may not be fun, but I urge doers to hone the craft of <em>saying</em>.  It&#8217;ll create even more distance from <em>them</em>.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design system contributions work better when everyone knows your name]]></title>
            <link>/posts/design-system-contributions</link>
            <guid isPermaLink="false">/posts/design-system-contributions</guid>
            <pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Some things work better in a small and cozy environment.]]></description>
            <content:encoded><![CDATA[<p>If you heard me talk about design system contributions, you know I haven’t been a fan. I’ve worked at some moderately large companies for the past decade. Not Weyland-Yutani big. But big enough to be a humble cog in a machine. </p>
<p>And in that setting, contributions have been more about feeling than function. They were a way to keep consumer teams engaged. It made it clear the design system team was something they could be a part of. But was it the most cost-effective way to run a system? Oh, <em>hell no</em>.</p>
<h2>Big orgs, big problems</h2>
<p>Big <em>anything</em> means complexity. Companies are no exception. Anything with a lot of people is going to make things complicated. Things that work fine for a few folks don&#8217;t with one hundred. And vice versa. </p>
<p>Contribution models are no exception. They’re  hard for systems that support a lot of people. How can people effectively contribute to a system supporting thousands of use cases? Especially when their focus is on a handful–or one. It’s hard for <em>anyone</em> to have such a wide perspective–especially when it’s not their full-time job.</p>
<p>And that’s how we get complicated contribution models. Thousands of system consumers could mean a deluge of contributions. One bad addition could impact hundreds of people. Safeguards, checks, and process get put into place for a reason. </p>
<p>Either way, contribution model’s success is inversely related to how involved it is. The more process, the more pain. All those steps may be important. But they also introduce more failure points. There are tax codes simpler than some contribution models.  One in particular made me question my mental acuity. I&#8217;ve seen some shit&#8230;</p>
<p>That’s why I’ve shied away from contributions at larger orgs. Now, that’s not to say that contributions at big companies <em>can’t work</em>. My experience says they’re <em>very hard</em>.  You may got it all figured out. Kudos. I don&#8217;t. And I’d rather focus on design systems than cracking the code of contributions at mega-corp scale. That’s just me.</p>
<h2>Contributions make sense for <em>Cheers</em>-sized teams</h2>
<p>But small teams are simpler. There’s less moving pieces. Less complexity. The problems are still there–but they haven’t snowballed to the point where they’re an <em>actual problem</em>. </p>
<p>I have a super-scientific take. Contributions are most effective on teams small enough where everyone knows your name. A contribution is a mutual effort. Mutual efforts rely on established relationships and a heaping spoonful of trust. Right or wrong, the bigger the org, the more little fiefdoms begin to form. The “team” is <em>actually</em> nine or ten real teams. The “mutual” in mutual effort doesn&#8217;t feel so mutual. </p>
<p>That’s when process begins to kick into overdrive. I couldn’t tell you what the exact cliff when things stop working. But a sign to look out for is when contributions begin with introductions.</p>
<h2>Not every process has to be a process</h2>
<p>I like to say that you should be able to describe a component in a sentence. Anything more and it’s too complicated. Similarly, you should be able to describe a contribution model in couple paragraphs. Maybe three. The process shouldn’t be <em>a process</em>.</p>
<p>Folks are going to disagree with this. They&#8217;ll say two paragraphs is not even close enough detail. <em>I agree!</em> That’s where established relationships and trust come in to play. Sure, you <em>could</em> outline every hypothetical  situation and edge case&#8230; Or you could create <em>just enough structure</em> so it gets done. And yes, that&#8217;s going to be a mess at a larger org. Which is my point.</p>
<h2>So, what could a contribution process look like?</h2>
<h3>Step 1: Make a recipe</h3>
<p>Add a recipe to the shared library. That’s it. People can as much or as little detail as they&#8217;d like. Stopping at step 1 is fine. No matter what happens, the creator has something everyone can use.  </p>
<h3>Step 2: Review a recipe</h3>
<p>If the creator or the team wants it graduate to the system, they’d review the recipe with the design system team. Maybe it goes in. Maybe it doesn&#8217;t. Either way, the recipe is still usable.</p>
<h3>Step 3: Contribute a recipe</h3>
<p> If everyone agrees to bring a recipe into the system, they do the following:</p>
<ul>
<li>Agree on what needs to change to the existing design</li>
<li>Define a spec for development</li>
<li>Write usage documentation </li>
<li>Assign owners for who takes on what</li>
</ul>
<p>That’s my one rule for contribution. There needs to be a payoff for  putting in the time to contribute. There are few worse feelings than wasted time. Putting in work and getting nothing out of it? That&#8217;s shitty. This process makes sure that, <em>at the very least</em>, the designer or engineer gets a recipe.</p>
<p>But, like, what&#8217;s a recipe?</p>
<h2><a href="https://bradfrost.com/blog/post/the-art-of-design-system-recipes/">Recipes</a> are low-key, air-quote contributions</h2>
<p>Recipes are a distinct composition of existing (mainly) of design system components. An example of a recipe would be an onboarding stepper pattern. All the design system’s bits and bobs are used to make something new.</p>
<p>Using the system for a recipe is the secret sauce. A good design system is going to cover all important bases–like accessibility. Which means a lot of the recipe’s details are <em>theoretically</em> sorted out.  Mind you, “theoretically” and reality aren&#8217;t the same thing. <em>But</em>, it creates a much higher chance for less overhead. </p>
<p>They’re the low-key, low-stakes way to (kinda) add to the system–in a good way. They provide a color-by-numbers interface for making something. This way means people don&#8217;t have to know all the gory details of the system to make something for it.</p>
<p>Can recipes be smaller than a pattern? Sure. Instead of using design system components, they’d use design system tokens. It’s the same idea, just taken down a rung in the hierarchy of design system elements.</p>
<p>The most important characteristic of recipes is that the design system doesn’t own it. No policing. No oversight. No nothing. It’s a place where designers can do what they think makes sense. Designers can choose to make recipes completely detatched from the design system. Which is fine. It also means it&#8217;ll only exist as a recipe. Which is also fine.</p>
<p>Now, this isn’t some magic bullet. A recipe library needs the same care and maintenance, like any other. And that means that one or more product designers will have to own it. Because–say it with me–the design system team doesn’t own recipes</p>
<h2>Small and mighty</h2>
<p>Yes, this is high level. Yes, there ten sub-steps for each outlined step. But, in my experience, a team with a strong partnership and trust fill in those gaps. Often differently each time. </p>
<p>Process and rules are important. But they also can get between people. I’ve seen loose process work really well among teams with a strong relationships and trust. Would this work in a large-org setting? Maybe, but I could see a hundred different ways it may not. I see this playing out much better in a healthy smaller team. Emphasis on <em>healthy</em>.</p>
<p>Some may see this as a cop-out. I prefer pragmatic. Some things scale like crap. My two cents is that contribution models fall in that category. But if you may want to try out my approach if you go to work where everyone knows your name.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design systems are today’s cure and tomorrow’s cause of shitty software]]></title>
            <link>/posts/design-systems-tomorrows-cause-for-shitty-software</link>
            <guid isPermaLink="false">/posts/design-systems-tomorrows-cause-for-shitty-software</guid>
            <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Design systems have been propping up quality from collapsing. And in doing so, risk making the collapse even more spectacular.]]></description>
            <content:encoded><![CDATA[<p>Making software used to be easy. Well, <em>easier</em>. Twenty years ago, desktop software <em>was</em> software. 99.999% of that used a mouse, keyboard, and monitor. Most were web-based–using plain HTML, CSS, and a (relative) sprinkle of Javascript. Frameworks existed, but there were less of them. Was it limiting? Oh, yeah–to the point of claustrophobia.</p>
<p>A new kind of claustrophobia has kicked in now. Software ships across countless platforms and device types. UI frameworks are all but considered mandatory. There are layers and layers of complexity that make 2005 feel like a kindergartner’s naive daydream. Managing the complexity of “modern” software takes considerable focus. And focus doesn’t grow on trees.</p>
<p>None of this happened overnight. The complexification of software crept in gradually. The ways of working haven’t kept up to account this–especially within design. The general process is basically unchanged. Sure, the tools are different and we have different names for stuff. But it’s the same song and dance.</p>
<p>And people wonder why software quality is in decline.</p>
<h2>How we’re keeping it together</h2>
<p>Abstraction has done a lot of the heavy lifting to blunt the impact of complexity. Kind of like shoving all your toys under the bed to clean your room. Make no mistake, abstraction has been a boon for productivity. It handles a lot of things that otherwise need deeper knowledge and skill. Abstraction makes tasks more approachable and attainable to a broader audience. Work that needed a front-end developer is now (theoretically) possible for a full stack dev. Why hire three specialist designers when one product designer can do it? Or, more accurately, “do” it.</p>
<p>Which brings me to design systems. They’re nothing if not an abstraction. And, boy howdy, have they been putting in work to stem the bleeding of managing complexity. The growth of design systems has gone a long way to keep the engine humming. Mature design systems handle <em>so much</em> that fly under the radar. Things like addressing critical states, accessibility compliance, managing edge-cases, performance, and more. These were the things designers and engineers used to sweat. Now, it just works. Great, right?</p>
<p>Right?</p>
<h2>The ticking time bomb</h2>
<p>Design systems and other abstractions keep software development&#8217;s engine running. But it’s starting to make some weird noises and the check engine light is on.</p>
<p>Do any of us see software getting <em>simpler</em> soon? No? Me neither. I&#8217;d bet the farm that design systems will only be more relied on moving forward. This sounds like a good thing. I don’t think so.</p>
<p>Design systems–like any abstraction–only obfuscate complexity. Yes, it speeds things up. Yes, it&#8217;s simpler at face value. But it&#8217;s yet another abstraction layer. And abstractions create complexity. Plot twist–our practice has been working to combat complexity by adding it elsewhere. You can only fight fire with fire for so long.</p>
<p>If/when this formula breaks down, we could see an even greater fall in software quality. Which should be a barrel of laughs.</p>
<h2>A yucky future of dependence</h2>
<p>Design systems exist to help people do their job faster and better. “Do their job” carries a lot of weight in that sentence. This assumes designers and engineers can make high-quality interfaces from scratch. Design systems just streamline the process.</p>
<p>But a funny thing is happening. Those skills to make high quality interfaces have started to erode. Specialist roles are disappearing. Remember front-end engineers? Instead of enhancing existing skills, design systems are becoming a dependency. Less people know how to create interfaces from the ground up. Abstractions, such as design systems, are becoming the new baseline.</p>
<p>It&#8217;s nice to be needed. But not like this. True dependency on design systems would change the fabric of the practice. Design systems have typically focused on happy paths and common use cases. Feature teams would build things the system didn&#8217;t have. Use was optional. But more teams rely on design systems to handle more of the work. Optional is turning into a hard necessity.</p>
<p>What happens when teams can’t ship a quality interface without the design system? What happens when you depend on the things to make the things? First, feature teams start square-pegging the design system into round-hole use cases. Components purpose built for specific situations are duct taped into something else altogether. Second, design system teams are pressured to cover more ground. More nice-to-have gaps in the system are now considered blockers. Quantity becomes the name of the game. Quality? That&#8217;s <em>so</em> yesterday.</p>
<p>Design system teams aren&#8217;t exactly flush with cash as is. Now imagine propping up quality across design and engineering. The typical funding, headcount and capacity ain’t enough. It’s a recipe for failure. And that failure will show up in even lower software quality.</p>
<p>This is how we’ll see a continual downward slide in quality. Dependency on design systems will further gut foundational skills for making interfaces. Greater dependency will force design systems to cover greater surface area. Sprawling design systems will become quality sinks due to their size. Dependent teams have no choice but to use the degrading system.</p>
<p>Next thing you know, teams are shipping crap built from a crap design system. What’s worse, as those skills drop, who’s left to make the next generation of design systems? What happens when there aren’t enough people to make the things that make the things?</p>
<h2>How do we diffuse the bomb?</h2>
<p>There’s no easy answer. Well, kinda. The things I suggest aren’t all that mind-blowing. The hard part is pulling it off in an environment allergic to moving slower and not breaking things. Nonetheless, this is how I’m personally circling this issue. Make no mistake–I don’t think this train is stopping. But that doesn’t mean we all need to get on–or get hit.</p>
<h3>Remain dogmatically focused</h3>
<p>Say no–as much as possible. Cover critical use cases and ignore the others. Draw a clear line for what the system supports and what it absolutely won’t. This won’t always be popular, but it has two critical values.</p>
<p>Saying no stunts dependency. Teams will need things the design system doesn’t have. Which means they’ll need to design and build it themselves. This is a good thing. This&#8217;ll force teams to flex their skills to make high-quality interfaces on their own. This means they can do it again the next time. The trick is finding the right balance between when to support and when not. No, there isn&#8217;t an easy answer.</p>
<p>Saying no also creates focus. Raising quality demands time and attention. The more a design system has, the more it has to maintain. The more it has to maintain, the less time and energy is available to improve quality. It’s not rocket science.</p>
<p>So, do less at a higher level of quality. Ween teams off relying on the system for everything. Drop support for unused components/patterns. Make quality a priority by not <em>making other things a priority</em>.</p>
<h3>Make education on fundamentals a core pillar of design systems</h3>
<p>Design systems that remove the need for foundational skills are killing them. I&#8217;m not saying it&#8217;s intentional, but it&#8217;s happening nonetheless. That’s not going to end well.</p>
<p>I’ve been guilty of saying, “You don’t need to worry about that–the system just takes care of it.” I was wrong. We need designers and engineers to worry about things. Which means exposing them to as much minutiae as possible. That’s not to say that design systems shouldn’t handle minutiae. It can–and should. But learning the details is, and always will be, important. High quality software needs everyone aware of and concerned about the details.</p>
<p>Design systems are perfectly set to teach these details. So many foundations run through design systems. Color palettes, type ramps, component architecture, API conventions–and so much more. Design systems can help teach people how to use it–and how it all actually works. This means going beyond &#8220;do this&#8221; and &#8220;don&#8217;t do this&#8221;. This means explaining. Give a “why” and &#8220;how&#8221; behind every principle, guideline, and best practice.</p>
<p>Yes, it&#8217;s a lot of work. But it gives people the skills to not just use the system. It helps them understand it–really understand it. And if they really understand it, they aren&#8217;t dependent on it. They’ll be capable of delivering quality independent of using the system.</p>
<h3>Get consumers of the design system involved</h3>
<p>The saying, “teach a person to fish” exists for a reason. Yes, documentation is a critical form of education. But nothing beats getting your hands dirty.</p>
<p>This can take shape in many different ways. New hires can spend a part of their onboarding embedded on the design system team. Team members can rotate on/off the team. Ambassador programs can create regular points of collaboration. There’s no shortage of approaches and no right or wrong way.</p>
<p>Design systems work a lot on foundations. Getting more people to work on them will help more people learn foundations. It’s not complicated.</p>
<h3>No smoke and mirrors</h3>
<p>Design systems can make many things work like magic. Magic isn&#8217;t real–it&#8217;s entertainment dependent on the suspension of disbelief.</p>
<p>A lot of high-level components/patterns can feel like magic. Think molecules or organisms. These kinds of elements represent the peak of design systems&#8217; potential. They can save countless human hours in design/development and increase quality.</p>
<p>I’m not suggesting we stop making these. I&#8217;m suggesting we remove the “magic”. These components are often black-boxed with no simple way to recreate. Teams need to buy into the magic.</p>
<p>Instead, it’s important for these kinds of components to be composable by anyone. Meaning all the parts to reproduce the component are available and accessible. There&#8217;s no magic–anyone can see how the sausage is made. And everyone has the tools to make their own sausage. This means that if/when a team needs to diverge–they can–while still using the system.</p>
<h3>Bare metal solutions</h3>
<p>I’ve been crapping on the over-dependence of abstraction for this entire article. Yet the elephant in the room is that many design systems are guilty of this. Let’s be honest, how many web-based design systems are <em>not</em> built on top of React? Make no mistake, this makes a lot of sense–especially from an efficiency perspective. I question how this benefits software quality in the long run.</p>
<p>It’s tempting to take a “jump to the end” approach towards building a design system. I think it comes at the cost of quality. The implementation of a design system is vital, but tangential. Its true value comes from its definition of foundations, standards, and best practices. Those are the things that last. Those are the things that lead to quality. The less that comes between that and implementation, the better. What better way to foster foundations and standards than to build directly on top of them?</p>
<p>There’s no reason why a design system can’t provide React components. But I don’t think it should be required. Having a headline React component can be a nice abstraction of type hierarchy. But we also have to question how much overhead comes with it. If we want engineers to feel more comfortable writing markup, we need to expect them to write more markup. It’s worth considering lower-level entry points to implementing design systems.</p>
<p>Much of our thinking to date is how much a design system can abstract. It may be worth flipping the argument to ask how little we can get away with. How far can pure CSS take you? With the rapid maturation of web components, there’s a growing opportunity to get back to basics. And it&#8217;s that focus on the basics that&#8217;ll help improve software quality.</p>
<h2>Quality has always been the point. Right?</h2>
<p>Sure, velocity grabbed the headlines. But the goal’s been higher velocity to create <em>quality</em> interfaces. If quality goes, design systems are nothing more than an enshittification accelerator.</p>
<p>The best way for a design system to succeed is to make sure everyone has the skills to never have to use it. Systems can define the shape of quality. They can enable quality. But at the end of the day, they rely on capable people to wield the system capably.</p>
<p>If design systems care about quality, they need to work in a way to sustain it. If you think trying to get people to use a system is stressful, wait until people can’t do anything without it.</p>
<p><em>This post was initially written for the <a href="https://zeroheight.com/blog/the-design-system-paradox-how-abstraction-can-hollow-out-quality/">Zeroheight blog</a>.</em></p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[The many layers of dependencies in design systems]]></title>
            <link>/posts/the-many-layers-of-dependencies-in-design-systems</link>
            <guid isPermaLink="false">/posts/the-many-layers-of-dependencies-in-design-systems</guid>
            <pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Every design system is built on something. For better and for worse.]]></description>
            <content:encoded><![CDATA[<p>Building a design system from absolute scratch is not a small feat. Modern interfaces are hilariously complex. &#8220;Hello world&#8221; in a modern app requires a lot of code and expertise. This almost always means that building on top of someone else&#8217;s code/technology. I&#8217;m calling this layering. Yes, there are more technical terms, but I&#8217;m a simple guy who like&#8217;s small words. I also want to avoid technical terms because layering isn&#8217;t <em>just about code</em>. This post focuses on web design systems to keep a consistent train of thought. But in my experience, the thinking applies no matter the platform.</p>
<h2>There&#8217;s no such thing as an unlayered design system</h2>
<p>A design system is always using <em>something</em> to render a UI component. It can be as &#8220;low-level&#8221; as layered on vanilla HTML/CSS/JS. It can be layered on a framework like React. But it doesn&#8217;t stop there. Design systems often layer on top of headless component libraries like React Aria. They layer on full design systems, like many have done with Material. It can even add layers on top of <em>that</em>–like adding data-viz components to Material.</p>
<p>All design systems are layered on top of <em>something</em>. the million dollar question is how high (or low) should you go? Any why? But keep in mind, the higher up those layers go, the more things become interesting. </p>
<h2>Making a design system on top of Bootstrap</h2>
<p>One of the first design systems I worked on, circa -6000 BC, was built on top of Bootstrap. That had a lot of advantages. It made initial progress incredibly fast. It was the most used framework around at the time. It was familiar and reduced the learning curve for those using it. And given how many decisions Bootstrap took care of, we had much less initial load to carry. It made a ton of sense and worked well&#8230;</p>
<p>There&#8217;s always the, &#8216;&#8230;&#8217;</p>
<p>Initial progress was quite fast–as long as we played nicely with Bootstrap. Things got tricky when we tried to bend it to our will. The wheels began to wobble once we began including major CSS overrides.  It only got harder from there. And managing Bootstrap updates&#8230; That was &#8220;fun&#8221;. As Bootstrap evolved and changed, our &#8220;fixes&#8221; would break. This made the codebase eventually feel like a vat of pasta. </p>
<p>Was this the fault of Bootstrap? No. We wanted the framework&#8217;s benefits without the costs of layering on a framework. That&#8217;s not how it works.</p>
<h2>The pros are the cons (and vice versa)</h2>
<p>What I&#8217;ve come to believe is that every upside of layering is also its downside. The trick is to maximize the upsides&#8217; benefits while slimming the downsides. </p>
<h3>A lot of the decisions have been made</h3>
<p>Building a design system from scratch requires making an eye-watering amount of decisions. Layering on top of an existing framework makes a lot of those decisions. Fighting those decisions can make life <em>very hard</em>. It&#8217;s important to know what you&#8217;re getting into–and what decisions you want to control.</p>
<p>If flows and patterns are the priority, layering right on top of Material could make sense. Want full control over how the system looks? That means a headless component library like React Aria is probably the ceiling. Want more control over what is rendered in the DOM (and how)? Go even lower. Every layer descended means more control. It also means more decisions to make. Oh, and more work to do. Rule of thumb: Less layers means more control, but more headaches (from more work). More layers means less control, but more headaches (from managing/supplementing dependencies). </p>
<p>Either way, it&#8217;s important to know you don&#8217;t just inherit the decisions of what you&#8217;re layered on. You also inherit the decisions from the things <em>they&#8217;re</em> layered on. Engineers understand this, designers may not. Run <code>npm install @carbon/react</code> and see <em>how much more</em> comes along in <code>node_modules</code>. </p>
<p>And that&#8217;s no shade on Carbon. But it&#8217;s important to know. Dependencies have dependencies–that you now depend on.</p>
<h3>Building on top of an established codebase</h3>
<p>The value of layering on top of established libraries is that they&#8217;re <em>established</em>. A lot of the issues, edge cases, and bugs are already ironed out. Those would all be work to plow through–which is daunting. Sure, LLMs can pump out code pretty fast. But time is typically a big gating factor to get things working well. </p>
<p>But, <em>established</em> can also come with baggage. The codebase may have accumulated tech debt. Or it&#8217;s built with stale ideas/technologies. Or it contains a yet-to-be-discovered security hole. Yes, you get the good of established functionality and bake-time. But you also get the bad that comes along with time.</p>
<h3>Tap into an shared mental model</h3>
<p>Layering on top of a library like React can be a quick win. People know how to use it–they can rely on muscle memory. Everyone can hit the ground running. This is no small part why React so pervasive with design systems. It&#8217;s critical for design systems to meet people where they are. This is not something to ignore. </p>
<p>Tapping into an established library is a tacit endorsement of their point of view. Ignore or buck that point of view and risk losing that shared mental model. What about those who don&#8217;t agree with that point of view? Let&#8217;s say a team doesn&#8217;t buy into &#8220;the React way&#8221;. They disregard those best practices when building their design system components. They could be leaving a lot of value on the table if people aren&#8217;t able to use the React components <em>like React</em>. So be careful how much you buck what you layer on–you may be missing the point. </p>
<p>On the other hand, what&#8217;s hot today is gone tomorrow. Who uses Bootstrap anymore (rhetorical question)? The asset of leveraging a popular library could someday become a liability. Teams that disagreed but followed suit anyways may be feeling regret. </p>
<h3>Community-backed</h3>
<p>Using an open-source, community backed library means not being alone. There&#8217;s support from other people contributing, pressure testing, and answering questions. This feels like a life-line for small teams with limited resources. </p>
<p>But when being a part of a community, that means being <em>a part of a community</em>. Meaning being one voice of many. People may not be interested in your requests. Your contributions may not be accepted. The roadmap may not be headed in a direction you don&#8217;t like. </p>
<p>Or, the community dries up and development stops altogether. Now you depend on a codebase created by other people, but you need to support. On your own.</p>
<h3>Continuous improvements</h3>
<p>Many libraries are constantly updated and improved. A lot of that work would be things your team wouldn&#8217;t have time for. This frees up to work on areas are worth the time and focus. </p>
<p>But update fatigue is a real thing. And not all those &#8220;improvements&#8221; may seem like improvements to you. Some of the changes may not align with your point of view. There will be breaking changes that involve migrations. Some migrations can be <em>incredibly time intensive</em>. Sure, you can stick to a previous version, but that comes with its own set of risks&#8230; </p>
<h2>There&#8217;s no right or wrong here</h2>
<p>Like I said, every rose has its thorn. The &#8220;right&#8221; decision has a lot to do with what you&#8217;re aiming to do–and why. Everyone is going to have their own mental questionnaire. Below is mine:</p>
<h3>How many frameworks need supporting?</h3>
<p>A lot of systems don&#8217;t have the luxury of supporting a single framework. It&#8217;s critical to focus on the common denominator when supporting more than one. Need your components to be available in React <em>and</em> Vue? The last thing you want is to have to update styles in two places.  So, it&#8217;ll going to be important to have a one solid HTML/CSS structure that both pull from.</p>
<h3>How much expertise (and time) is <em>really</em> available?</h3>
<p>It&#8217;s tempting to want <em>full control</em> over a system. But are you prepared to build everything from the ground up? That may sound fun, but you have to ask yourself if have the time and chops to pull that off. React isn&#8217;t perfect, but it&#8217;s one hell of an accomplishment. Same with Material. It&#8217;s important to be honest about what you&#8217;re ready to take on and live with. And not just about you. Are you sure you can make the thing that supports hundreds of designers and engineers on a daily basis? To power a product millions use? Think about that before you sign on the dotted line.</p>
<h3>How loose can the dependency be?</h3>
<p>Not all layers need to be tightly coupled. Sometimes a little more upfront work can save a ton of headache in the future. For instance, I recommend managing design tokens in JSON instead of Figma. JSON is a standard, portable format and can go <em>anywhere</em>. Yeah, that means those JSON values will need to be imported and synced. But it also represents one less hard dependency in case a design tool migration needs to happen.</p>
<p>Being able to “rip the cord” is an immensely liberating feeling.</p>
<h3>How specific are the needs?</h3>
<p>Does the business rely on supporting an old legacy browser? What happens if/when the UI framework drops support? How much risk does that represent?</p>
<h3>What&#8217;s Plan B?</h3>
<p>It&#8217;s worth taking a moment to consider how to avoid a worst case scenario. Try to pre-plan a graceful exit where a dropped dependency doesn&#8217;t spell doom. For me, that means biasing towards standard formats and technologies. Sure, some folks prefer the developer experience of CSS-in-JS. But CSS-in-CSS can be used in <em>any</em> web stack. </p>
<h3>Who are the people working on those dependencies?</h3>
<p>How long have they been around? Do they have a history of doing good work? Are they trusted? The design system is now partially relying on these people. It&#8217;s worth knowing who they are.</p>
<h3>How much functionality is actually needed?</h3>
<p>Don&#8217;t inherit the Titanic to ship a canoe. Keep a design system as small as possible. It may turn out 99% of what a library offer isn&#8217;t relevant. It&#8217;s probably worth building that 1%.</p>
<h3>What&#8217;s the endgame?</h3>
<p>If the goal is to spin up a product and sell it in a year or so, layer like it&#8217;s going out of style. A lot of the downsides of dependencies only show up over time. The longer the horizon, the more beneficial ownership and control becomes.</p>
<h2>Own what matters</h2>
<p>No design system is built completely from scratch. That’s impossible. The moral of this story is not to hand crank everything. It’s to be intentional about what you own and what you don’t. A system focused on strong presentation better damn well own its visual styles. If it’s first class developer experience, then again, you need to own it. Dependencies aren’t to be avoided at all cost. Neither are they something to take on willy-nilly. They’re a necessity–both a pro and a con–to consider with care.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Fame, fortune, and podcasting]]></title>
            <link>/posts/fame-fortune-and-podcasting</link>
            <guid isPermaLink="false">/posts/fame-fortune-and-podcasting</guid>
            <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A story about my time podcasting and how it's led to untold wealth and international celebrity status.]]></description>
            <content:encoded><![CDATA[<p>I’ve been on a podcast for over four years now. I never thought I’d be on a podcast <em>at all</em>, let alone this long. Which podcast is it? Doesn’t matter. Chances are you haven’t heard of it anyways. That’s not the point of this post. </p>
<p>The point is if you decide to make a podcast, no one will listen, you’ll lose money, and it’ll be <em>totally worth it</em>. These past four years have been immensely rewarding. It’s one of the best impulse-decisions I’ve ever made. More people should spend their time and money to make podcasts no cares about.</p>
<h2>Disclaimer: I don’t actually podcast</h2>
<p>What I do is get on a call and talk for roughly 30 minutes. Then, a week later, a podcast episode shows up. Like magic. My partner Davy <em>podcasts</em>. He sets up the recording. He edits the audio. He publishes the episodes. He does <em>everything</em>. Which is probably why I&#8217;m having so much fun. </p>
<h2>Every great story starts with a dumb idea</h2>
<p>It’s peak Covid and everyone is stuck in their houses. We&#8217;re trying to distract ourselves from the daily, “unprecedented times”. My buddy Davy and I stay in touch via texts and I probably said something like, “We should do a podcast.” And that was it. No grand plans or big dreams. Just two dummies that were too dumb to think they couldn’t make a podcast. </p>
<p>And that’s the thing. Like so much in life, shit isn’t as hard as it looks. Podcasting doesn’t take much. You need a mic, a laptop, and (ideally) a partner. Sure, there’s other stuff, but you get the idea. One of the best things we did was not think too much. It&#8217;s frightening how often I find that useful advice.</p>
<h2>You pick up a lot of stuff in four years</h2>
<p>Again, I know next to nothing about the technical aspects of podcasting. But I&#8217;ve learned a lot about the stuff around it. </p>
<h3>Some people take podcasts way too seriously</h3>
<p>I try to make it a point not to talk about my podcast. Ever. I’m hoping this doesn’t count because I’m not specifically calling mine out. Actually, crap, it <del>is</del> was on my homepage. That&#8217;s embarrassing.</p>
<p>I don&#8217;t like to talk about it because, a) it’s insufferable to do so, and b) 95% of people could (rightfully) not care less. I should know–I’m one of them. </p>
<p>The other 5% assign way too much credibility. People have called me an expert, thought leader, and all sorts of other slurs. Like  having a podcast means something. Please refer to how this got started. Anyone can make a podcast in minutes. That’s what’s so great about it. It also means a podcast has the same credibility as your average YouTube comment. </p>
<p>Some folks think they&#8217;re not qualified to podcast. Like there are any qualifications on the internet. The folks on <a href="https://shoptalkshow.com/">ShopTalk</a> refer to podcasting as “mouth blogging”. I’ve yet to hear a better description. And like blogs, anyone can have one. No one is checking credentials. Some are decent. Most aren&#8217;t–which is fine. That’s not the point.</p>
<h3>The point of a podcast is to get things out of your head</h3>
<p>Most of the ideas we have rattling in our head are incredibly dumb. The act of blurting them out does two things. 1) Helps you come to terms with the terminally-dumb ideas and, 2) Forces you to un-dumb the ones that have potential.</p>
<p>I maintain the opinion that writing is the best way to distill your thoughts. But sometimes you ain’t got time for that. If you’re like me and find writing to be one rung above a to-the-death pit fight, podcasting may be for you.  </p>
<p>Sometimes it’s helpful to just talk through an idea–especially while it’s still forming. I’ve found podcasting to be a great pre-first draft for a later blog post. I’d say blogging and podcasting are a great combo if you have the time and inclination. </p>
<p>That said, talking and writing ain’t the same thing. Maybe all you do is stick to talking on a podcast. Either way, you’re getting your ideas out into the world. Good on you.</p>
<p>Either way, the process of sharing an idea will make it better. It’ll be clearer, more succinct, and with less holes. So you’re getting a ton in return even when inevitably no one listens. </p>
<h3>It’s a great way to keep in touch with friends</h3>
<p>The main idea behind the podcast–at least for myself–was to create a ritual to hang out with a friend. Davy and I were usually talking about design systems anyways–we just decided to record it. </p>
<p>I’m a borderline recluse. So a ritual like this has been huge in staying connected with my friend. Now, I’m not saying podcasts are going to solve the loneliness epidemic. But it sure as hell ain’t going to hurt it either.</p>
<p>And then there’s the other side of the podcast. I joke that no one listens to our podcast. That’s not <em>entirely</em> true. It gets <em>some</em> listeners (that’s as specific as I’ll get). But the people who do listen, <em>fucking listen</em>. We have a core audience that seems to come back for almost every episode. In a way, it’s how I can “stay in touch” with folks I know. Kind of like sending Christmas card with the year’s updates–but it’s every two weeks and about design systems. </p>
<h3><em>Doing the thing</em> is the fun part</h3>
<p>I’m not ashamed to say that I enjoy fun. And while I like writing, I’ll <em>never</em> mistake it with fun. Podcasting has been a way to get many of the benefits of writing–but with a lot more fun. Now, keep in mind, I do none of the work for the podcast. Which is probably why it doesn’t feel like work. Major caveat. </p>
<p>Talking about the right subject with the right person/people is a recipe for fun. Fun for you, for your co-host(s), and for the four people that listen. I’m joking–two people. But that’s what’s great–you all had fun even if <em>no one</em> listens. And believe it or not, it’s OK to have fun without other people knowing about it.</p>
<h3>It’s the most low-key way to be an independent publisher</h3>
<p>I didn’t dawn on me until a few years in that podcasting is still indie at its core. Somehow this format has fallen through the cracks and avoided being swallowed up. It’s RSS-based and can basically be hosted from <em>anywhere</em>. Sure, it’s syndicated in commercial platforms, but it doesn’t <em>need to be</em>. And that great–especially now. </p>
<p>Social media has been a complete failure. We made a huge mistake by donating our thoughts, ideas and creativity to these monsters. Making a podcast is the most pain-free middle finger to all that. You may think your social media platform of choice is fine. And it may be–now. All it takes is a change of ownership for it to become a nazi porn platform. Or even worse, LinkedIn. Having an independent podcast means you never need to worry about that. You can keep truckin’ in your cozy little space as the next platform goes up in flames. </p>
<p>How in the world are there only like five design systems podcasts? And by such untalented people? Okay, fine, maybe just one of them is untalented. We need more voices talking about things they’re interested in. It&#8217;d also be nice if it&#8217;s stuff they&#8217;re semi-knowledgable about. We need those voices broadcast on <em>not</em> TikTok, Twitter or LinkedIn. Maybe with a few more peeps who aren’t middle-aged dudes. </p>
<h2>No, I probably won’t listen to your podcast</h2>
<p>And that’s fine. A good idea isn’t measured in stars. Fun isn’t measured in reposts. A platform isn’t a platform unless it’s yours to stand on. What I’ve learned is that the value of making a podcast is just that. Give it a try.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Public design systems are worth it]]></title>
            <link>/posts/public-design-systems-are-worth-it</link>
            <guid isPermaLink="false">/posts/public-design-systems-are-worth-it</guid>
            <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[It’s incredibly valuable to make a design system available to all–no matter what the bean-counters say.]]></description>
            <content:encoded><![CDATA[<p>Remember Web 2.0? Those were the days. Blogging, RSS, open APIs everywhere. It was a true marketplace of ideas. And we all benefitted from it. Every idea shared lifted every boat in the harbor. Everyday felt like it a brought a new discovery. My rose tinted glasses may be flaring up, but I don’t think I’m alone in thinking it was a special time. A better time.</p>
<p>Now let’s fast forward. The marketplace went bankrupt. Sharing ideas for the sake of sharing? How quaint. We’re very much in the, “what’s in it for me?” phase of the web.</p>
<p>I’m not mad–I’m disappointed. Ok, fine, I’m a little mad. But this seems to be the cycle. To quote Eric Hoffer: &#8220;Every great cause begins as a movement, becomes a business, and eventually degenerates into a racket.&#8221;</p>
<h2>Public design systems are our marketplace of ideas</h2>
<p>Design systems lagged behind the web a bit, so we’ve been gleefully in the movement lifecycle. It’s been our little Web 2.0 moment where work and ideas have been open. System teams publish their work for all to see. Am I naive enough to think this hasn’t at least a little bit about self-aggrandizement? Of course not. But the benefits remain.</p>
<p>Public design systems have lifted all boats in the harbor. Most design system teams do the rounds to see how other teams have tackled problems. Every system that raises bar puts healthy pressure on others to meet or exceed it. This shared ecosystem may be the most important facet of the design systems practice.</p>
<p>But things that begin as a movement don’t stay that way.</p>
<h2>All good things&#8230;</h2>
<p>There’s a growing trend to close down public systems. Funny enough, the first thing I did when I left Pinterest was clone the Gestalt repo. I had this spidey sense it wouldn’t be around forever. Yes, their web codebase is still open source, but the docs have gone private. That one stung. Gestalt wasn’t the first design system to be public. It wasn’t the best one either. But it’s hat was in the ring–and that’s what mattered.</p>
<p>But that’s only one design system, right? Sadly, I’m hearing more chatting about mounting pressure to privatize their systems.</p>
<p>This is an incredibly shitty idea.</p>
<h2>It doesn&#8217;t seem like a shitty idea</h2>
<p>I don’t want to paint some unrealistic picture. Making a design system public is a pain in the ass. There’s plenty of crap to deal with. The obvious one is how to handle confidential/proprietary information. There&#8217;s also risk of &#8220;speaking on behalf of the company&#8221;. Documentation is a company-owned property. Is every word vetted by people with law degrees? Probably not. And let&#8217;s not forget that going public brings gobs of added work.</p>
<p>There are plenty more reasons where those came from. A private design makes all those issues non-issues. With that out of the way, I’ll now explain why it&#8217;s still a shitty idea.</p>
<h2>Decisions don&#8217;t exist in a vacuum</h2>
<p>I think a lot of teams view the public/private decision through the lens of their own benefit. Ironically they&#8217;re missing how each system exists in a larger system.</p>
<p>That individual decision to go dark sets a precedent. It makes it that much easier for the next team to justify doing the same. The next thing you know, public systems are rare. Then gone altogether. And everyone’s flying blind.</p>
<p>These decisions are infectious. And on the flip-side, other teams take notice when a system opens up. Those cases make it easier to do the same. &#8220;Everyone&#8217;s doing it&#8221; is a powerful driver in the corporate world.</p>
<p>Sharing a design system may feel like a drag, or a luxury. But the ability to study/source other design systems is a necessity. One that&#8217;s taken for granted. Losing this resource will make design systems work much, much harder.</p>
<h2>Going public is an unmitigated benefit for design systems</h2>
<p>The statement above may seem hyperbolic. I don&#8217;t think it is. Yes, private is easier–but it lowers the ceiling of potential. Significantly. Here&#8217;s how.</p>
<h3>It&#8217;s a quality forcing function</h3>
<p>If the 2020’s have taught us anything, it’s that a product doesn’t need to be good to be valuable. It doesn’t need to be effective. It doesn’t need to work as advertised. It needs to make money.</p>
<p>But here’s the thing about design systems. Their value is entirely based on being good. Design systems don’t make money. They help companies work more effectively–which makes money. They do that by being good. For design systems, good takes the shape of well designed and engineered components. Clear guidelines for implementation. A strong, intuitive developer experience. Good equates to better output in less time. That right there enables design systems to pay for themselves (and then some).</p>
<p>But that payback depends on a high quality system. Which is why quality has to be at the center of everything a design system team does. “Work fast and break things” is anathema.</p>
<p>What in the hell does this have to do with public design systems? Well, I’ll tell you. I’ve yet to find a better forcing function for design system quality than making it public. Because it turns out that people care <em>that much more</em> when the whole damned world can see it.</p>
<p>I’ve worked on private and public systems. My experience is that public systems lead to higher quality end results. Without exception. It&#8217;s public presence drives more thought and attention to what gets published. It&#8217;s not something that&#8217;s discussed–it doesn&#8217;t need to be. It&#8217;s just understood. Documentation gets one more edit. Prop names get double checked. The layout and organization of visuals get more love and attention. Everything gets an extra coat of varnish before going out the door.</p>
<p>And you know who benefits? Everyone. The design system team benefits because they’ve delivered something better. The broader community benefits because they get to reference it. But more than anyone, the daily users of the system benefit the most. Instead of a half-assed wiki page, they have something people are willing to put their name behind.</p>
<p>Work behind company lines is <em>notoriously bad</em>. The things that don’t see the light of day don’t get as much polish. It’s critical to place a design system in a position to get as much polish as possible. It may not feel like a system’s documentation or library is external. But all those components in the product very much are.</p>
<p>It may not be right. It may not be fair. But people are going to take more pride in the work that the public at large will see. It’s a tale as old as time. You can fight it, or you can work with it.</p>
<h3>It&#8217;s easier to access and use</h3>
<p>Do you enjoy five-factor authentication to view a website? I understand the necessity of VPNs and security measures. But why not leave that for the things that actually need to be secure?</p>
<p>Building an org-wide habit of reading system documentation is challenging on its own. Throwing in extra friction is just plain mean.</p>
<h3>It&#8217;s a recruiting funnel</h3>
<p>Gestalt’s documentation was a positive reinforcing feedback loop for quality. The public presence attracted great talent. That allowed us to hire great talent. That great talent made our system better. And since our better system was available for all to see, it attracted even more great talent.</p>
<p>And it’s not rocket science why. People want to know what the hell they’re getting into with a job–especially now. Being an open book has the benefit of, well, being open. You can point to your system and say, “Hey, do you want to work on that?”</p>
<p>It’s pretty damned sweet for the interview process as well. Applicants actually have a genuine way to prep ahead of time. They can assess the system and have a general idea of what they&#8217;d be working on. That’s a win/win in my book.</p>
<h3>It helps make a happier design system team</h3>
<p>I’ve discussed the challenges design system teams can have with morale. A lot of that comes down to not feeling seen. That can be blunted by having a public system. That doesn’t guarantee that they’ll gain greater visibility within their org. But there’s a good chance they’ll collect some outside eyeballs. And that can go a long way to mellow bad mojo.</p>
<p>It’s also worth noting that a pinch of external validation can go a long way to build up internal cred. I don’t think it’s chance that Gestalt’s outside exposure aligned with more internal visibility.</p>
<h3>It trains the next generation of system designers</h3>
<p>The current generation of system designers and engineers won&#8217;t be around forever. Or even in a decade. The cast needs to be continually refreshed. And let’s face it, learning design systems is effin’ hard. You know what a great learning resource is? I’ll let you guess.</p>
<p>Design systems are becoming a larger part of the product development process. The market isn’t flooded with skilled design system peeps. And no, AI isn’t going to fix this. We’re already short people and none of us are getting any younger.</p>
<p>Open design systems are the library for people wanting to get into design systems. They’re a free resource to expand their understanding. There’s no college of design systems. Bootcamps exist, but they’re bootcamps–and I’ll leave it at that. The generation who shaped design systems didn’t create universities–they built libraries. Those libraries can train the next generation once people like me age out. When the libraries go, so does the transfer of knowledge.</p>
<h2>Public doesn’t need mean full-monty-open</h2>
<p>Public doesn’t mean everything’s flapping in the wind. Open source is great. Source available is awesome as well. But even a closed source design system can be public through its documentation. Yes, open source/source available lends itself to better public documentation. It’s easier to connect design, guidance and implementation when code is a hyperlink away.</p>
<p>But documentation without code is still valuable. And not just for designers. The thinking/logic behind how to compose an interface is valuable to all disciplines. And 99% of that is not proprietary in any way.</p>
<p>This isn’t some all-or-nothing kind of thing. Not everything needs to be public to be public.</p>
<h2>Just take the goddamned win</h2>
<p>I’ve found few things more valuable for a design system than to work with the garage door open. The value may not show up in a spreadsheet. It may not pump next quarter’s goals. But it has broad and long-lasting value. It’s such a small and simple gesture–in the relative sense–for so much in return.</p>
<p>I see the writing on the wall and I don’t like it. What we currently have only works if enough chip in. But it’s looking like it’s too tempting to pull the cord on an “unnecessary expense”. Cord-pulling tends to be contagious.</p>
<p>I hope I’m wrong. Or it’s just a phase. Otherwise we’ll all be lamenting the big, fat, L in our future.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design system ambassadors–the goldilocks of collaboration]]></title>
            <link>/posts/design-system-ambassadors</link>
            <guid isPermaLink="false">/posts/design-system-ambassadors</guid>
            <pubDate>Sat, 06 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>“Ivory tower design system”. That’s a more common four-word combination than people may think. A centralized design system is, by nature, detached from the people using it. It’s a downside that I’ll take every single time. But it’s a real issue.</p>
<p>A detached design system team is risky as hell. Mainly because the symptoms of being cut off from the systems users tend to lag. Once the symptoms begin to show, it can get real bad, real fast.</p>
<p>That’s why design system teams put in a considerable time trying to limit disconnection. Here are the stages of engagement I’ve typically seen:</p>
<p><strong>First stage: Connect with everyone all the time</strong>
The team attempts to join every crit. They check in with every person. Their existence is a meeting. Welcome to Burnoutville. Population, you.</p>
<p>It’s not rocket science to conclude embedding into consumer teams improves connection. It’s also not rocket science to conclude that does not scale. At all.</p>
<p><strong>Second stage: Connect with everyone some of the time</strong>
The next logical conclusion is to meet on demand. That’s a no-brainer, right? In my experience that doesn’t work out too well either. Calendars and schedules fill up and needs typically don’t give a two-week notice. I’ve seen this model atrophy as people become unavailabl. The habit trails off–because the process isn’t habitual. Ad hoc becomes no hoc.</p>
<p><strong>Third stage: Retreat to the fortress of solitude</strong>
The next conclusion is to remove the touch points altogether. Asynchronous communication becomes the primary method. That’s far and away the most cost-effective approach.</p>
<p>But just because something can’t be measured doesn’t mean it isn’t meaningful. Efficiency comes at the cost of connection. Collaboration can wither. It’s not inevitable, but it’s easy to lose touch as a design system team without explicit collaboration.</p>
<h2>How about the right people at the right frequency?</h2>
<p>Design systems at even moderately-sized companies have to be choosy about engagement. There’s too many people to have deep touch points with every single person. It’s not personal, it’s math.</p>
<p>It’s a vibe-killer to say that some people’s opinions are more valuable than others&#8230; But it’s true. Your doctor&#8217;s diagnosis for that rash that won’t go away is way more important than some dude in line for coffee. It feels nice for everyone to have a voice. Design system teams have to prioritize the voices with the right context. That’s not to say others should <em>never</em> be heard. But proportion is important.</p>
<p>Who matters the most? That’s up to every team to decide. I don’t think it’s all about seniority. The qualities I look for engagment, commitment and a strong point of view.</p>
<p>The more focused the group is, the greater chance some real collaboration can occur. Especially if the people collaborating actually want to.</p>
<h2>Now let’s name it something fancy to make it sound important</h2>
<p>I’m not a fan of marketing, but I also am not naive enough about the allure of a fancy title. People are gravitate to the allure of status. Now, that can be bad. You don’t want people joining just to add another corporate merit badge to their collection. But it doesn’t hurt to give this role a little bling to get people’s attention.</p>
<h2>This better be worth everyone’s time</h2>
<p>Ain’t no one has time for nothing no more. Ambassador programs need to have a high bang-for-buck return. It’s important to bias towards adding the least people for the least time for the most return. Not mind-blowing, I know.</p>
<p>Roles and responsibilities for each side need to be simple, clear and actionable. I have some real mixed feelings about RACI/DACI tables, but this may be a good time to make one.</p>
<p>These meetings better be the crispest and leanest ones the team runs. I’m talking agendas, pre-reads, meeting notes, action items. All that. Hell, with any luck, most meetings end early. Keep it short, simple, productive and (ideally) fun.</p>
<p>Each side needs to get something they want–but otherwise can’t. And make no mistake, there’s no shortage of want. Let’s cover the classics:</p>
<h3>Feature teams want support and influence</h3>
<p>The people who use the design system obviously want it to support what they’re working on. That can be hilariously hard to predict ahead of time. On Monday, a team thinks they don’t need a new component. On Tuesday, they do. Immediately. Design system teams can’t pivot that quickly. In large part because it sets the expectation that every request will happen that fast. But, maybe exceptions are made for teams that with ambassadors&#8230; That can be an enticing incentive.</p>
<p>Hopefully, most support isn’t of the “need it yesterday” variety. Less urgent asks can be made during planning cycles. Knowing that a needed component/pattern will be ready ahead of time can be a huge relief for feature teams. Ambassadors can help steer the design system roadmap to ensure what they need makes it in. That can also be an enticing incentive.</p>
<p>Teams also want the system to work <em>for them</em>. Maybe the type ramp isn’t quite handling their needs. Or some button variant needs tuning. Ambassadors have the ear of the design system team to steer the direction to better meet their needs. Granted, not at the cost of other teams’ needs. But it nonetheless gives them a direct line to the people who make system decisions. Also tempting.</p>
<h3>Design system team want visibility and feedback</h3>
<p>Anyone who’s worked on design systems knows how important visibility is. It also feels impossible to get. Having a view into all in-flight design work <em>before development begins</em> is priceless. System teams can get that information from ambassadors. They’re the window into all team-level happenings–without having to join every team crit. That’s gold.</p>
<p>Speaking of visibility, design system teams often struggle with having their comms seen. This isn’t surprising given the flood of information that teams are pelted with. But ambassadors represent a liaison to an org’s collective ear holes. Simple design system cascades from team ambassadors can raise awareness significantly.</p>
<p>Then there’s feedback. Design system teams are often starving for input on new/improved components. Getting eyeballs from feature teams can prove to be a herculean feat. Ambassadors can be that reliable input that’s so very needed.</p>
<h2>Why not scratch each others’ backs?</h2>
<p>The arrangement laid out sounds transactional. Because it is. I don’t think that’s a bad thing. Corporate altruism is self-contradictory. It doesn’t mean people don’t want to work together, but it requires mutual benefit. That&#8217;s why, any ambassador program needs to be scratch both backs.</p>
<p>This tracks at the individual level as well. Expecting volunteers to put in time on top of all their other work is a recipe for low participation. I’m a big believer that there needs to be some carrot for anyone putting in the time. Fancy title aside.</p>
<p>The carrot may be a prerequisite for promotion past a certain level. It could be a yearly bonus. Or something else altogether. But extra work should come with extra compensation.</p>
<p>Will ambassadors solve poor cross-team collaboration. Hardly. But it can be a good start. Like most things, finding the right balance between competing factors is the key. But hey, you might like Burnoutville–who am I to judge?</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[What I learned from making a (second) mobile app]]></title>
            <link>/posts/what-i-learned-making-a-second-mobile-app</link>
            <guid isPermaLink="false">/posts/what-i-learned-making-a-second-mobile-app</guid>
            <pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Some things just require a second time to fully grok.]]></description>
            <content:encoded><![CDATA[<p>Every now and then I get an odd tendency to just go off and make something. It’s why I made <a href="https://pjonori.design/work/olivia-sans/">a typeface</a>. It’s why I made <a href="https://apps.apple.com/us/app/it-plays-music/id6475738719">a mobile music app</a>. And it’s why I made another mobile app, <a href="https://apps.apple.com/us/app/it-makes-noise/id6749282237">It Makes Noise</a>.</p>
<p><img src="https://pjonori.blog/posts/what-i-learned-making-a-second-mobile-app/it-makes-noise.png#noshadow" alt="Screenshots of It Makes Noise">
<em>Yup, that&#8217;s what I made.</em></p>
<p>It Makes Noise is a mobile app that (you guessed it) makes noise. I wanted something to block out background sounds. Nothing on the market really did it for me–so I did it for myself.</p>
<p>I learn a lot through these projects. That’s primarily why I do them. It seems like it’d be worth outlining what those things were. Keep in mind, these are my experiences. No more, no less. I make no guarantees about their value for anyone other than me.</p>
<h2>AI continues to be a real mixed bag</h2>
<p>Yeah, I used AI to make my app. I tried to use it with my first mobile app, with little success. This time worked <em>better</em>, mainly due to better tooling. But to say it was effective would be a wholesale lie. This is solely based on my experience. I’ve used AI with some success on other projects. All those projects were significantly smaller than this one.</p>
<p>I thought it’d be interesting to get a first-hand take on vibe coding. I decided to throw caution and reason to the wind. I let an LLM build out the codebase with my involvement limited to prompts.</p>
<p>I will never, <em>ever</em> do that again.</p>
<p>The appeal of AI to so many is how fast something real is made. That was exactly how this project played out. I had an app that would compile and function the way I had in my head (more or less). Mind you, it took some wild turns, but there was <em>something</em> resembling an app in a short amount of time. I should have stopped there.</p>
<p>But I didn’t. I decided to just ride this out to the bitter end. And it was in fact bitter. The initial app was <em>fine</em>. But as I tried to shift functionality, fix bugs and iterate on features, the joy ride broke down.</p>
<p><img src="https://pjonori.blog/posts/what-i-learned-making-a-second-mobile-app/productivity-over-time.png" alt="A graph charting my productivity with AI-driven development over time">
<em>A hyper-precise graph that charts my productivity with AI-driven development over time.</em></p>
<p>The innate problem with AI is that it can feel magical at first. So much in such a short amount of time. But that spike in productivity begins to slide over time. And in my experience, it eventually descends into madness. Do you enjoy tracking down a bug in tens of thousands lines of code that <em>you didn’t write?</em> If so, you’re in for a treat.</p>
<p>The codebase got so convoluted and irrational that I had to step in and break the party up. The app required a full re-architecture that culminated in roughly 50% of the code removed.</p>
<p>Now, many are likely saying, “That’s not how you&#8217;re supposed to use AI.” To which I <em>very clearly</em> understand. But like it or not, many people, especially designers, are attempting to use AI how I did. I&#8217;ve long held this approach to software development to be problematic, if not dangerous. But who am I to judge without having direct experience?</p>
<p>Now I do have experience. I hold this approach to software development to be problematic, if not dangerous.</p>
<p>AI can be like arrogance and overconfidence in a bottle. It can give people the perception that they can do things with no direct skill/experience. And that’s the problem. They have no skill/experience in the given subject. They have no way to judge the quality of what’s generated.</p>
<p>I know enough to know what I don’t know. That’s valuable in and of itself. I understand where I’m safe to tread and what I need to leave be. This experiment was enough to reaffirm I’d rather take the time to know what I’m making.</p>
<h2>I’d still use AI though</h2>
<p>I will never vibe code anything of even moderate complexity again. I tried it, despite my apprehensions. If anything, it was worse than I imagined.</p>
<p>But, there remains value. I use it for two different scenarios:</p>
<ol>
<li>Stub out a tightly scoped and narrowly defined set of functionality</li>
<li>Help me with something I have no idea how to even start</li>
</ol>
<p>Searching for answers to technical challenges can also be a mixed bag. Sometimes I don’t even know the terminology needed to seek out the answer. Also, the internet kind of sucks now. Even if the answer is out there, I have to fight with ads, SEO-riddled gobbledygook and paywalls.</p>
<p>AI has been a better solution in certain cases. To say otherwise would be disingenuous. I don&#8217;t plan to abandon AI. But I prefer to have it solve a problem outside of the main codebase. That can take two routes:</p>
<ol>
<li>Creating separate, self-contained demos to reverse-engineer</li>
<li>Provide code recommendations that I manually copy into my code (or not)</li>
</ol>
<p>I’ve found those approaches quite useful. But that is a very different reality than the promise of, “Hey AI, make me an app.”</p>
<h2>Doing something creates respect for the people who do it well</h2>
<p>This project also reaffirmed the value in doing something outside your own wheelhouse. And by doing, I mean <em>actually doing it</em>. Not sitting in the passenger seat pretending to drive. Really driving. That first-hand experience gives a new appreciation for those who are actually good at it.</p>
<p>That’s probably the thing that worries me the most about AI. I’m concerned it’ll erode our appreciation for the people who have put in the work. I see this harming society’s collective expertise in countless subjects. Not to mention how it devalues the very people who could counteract the harm.</p>
<p>From my view, that’s the insipid cost of vibe <em>whatevering</em>. It’s the ultimate means to an end. I’ll go to the grave believing the slog towards the end is what’s truly valuable. The things I’ve done have made me who I am. I have a comically meandering career. And, yes, it took a while, but those various off ramps I&#8217;ve taken have rounded out my thinking. I wouldn&#8217;t change anything. I pity those who will lose out at the chance to learn things the hard way.</p>
<p>All those meanderings helped me to pull the atrocity-of-a-codebase back into something usable. Your run of the mill designer won&#8217;t have the experience to do that. There are a lot of designers who are about to vibe code into in comedic humiliation.</p>
<h2>It’s important to give a project time to breathe</h2>
<p>This app started a long, long way from where it ended. I’ll admit that the current version of the app came together pretty damned quickly. But that came after sitting with a janky-ass prototype for large amount of time. It was <em>barely good enough</em> for just me. But it was good enough to clear things up.</p>
<p>I made something to scratch a personal itch. And it kind of worked. Barely. That time sitting in my metaphorical stink gave me a much better idea of what I actually wanted. I paused for a large amount of time to gain a much larger amount of clarity.</p>
<p>Yes, there were still plenty of minor course corrections once I restarted work. But they were minor. Sitting, stopping and evaluating saved a ton of design and development time.</p>
<p>In truth, that’s painting a rosier picture than what really happened. Many dumb ideas don’t start off dumb. They become dumb because context shifts around them. This app started off as a tool to procedurally generate binaural beats and white noise. The app at that time let you select your frequency and phase shift to create custom recipes. At some point, the app shifted to be simpler. But the underlying functionality did not.</p>
<p>I ended up with a frankenstein codebase. The app was juggling multiple audio controllers for different audio types. I didn’t take a moment to re-evaluate the situation. Instead I kept building on top of a shaky foundation to feed progress addiction. At some point it dawned on me that I could just use audio files for <em>everything</em>. I should have come to that conclusion <em>much sooner</em>. And I would have. If I would have stopped to think for a damned minute.</p>
<h2>I still don’t understand iOS development</h2>
<p>To be more specific, I don’t understand SwiftUI–not <em>really</em>. It still feels magical at times. Things seem to <em>happen</em> and I don’t fully grasp why. I’ll admit there are many lines of code in the app that work for reasons beyond me.</p>
<p>That’s <em>obviously</em> bad.</p>
<p>I can still make things work, but I know they’re not elegant. That bothers me, but I’ll live. I know enough to build something that more or less reflects what’s in my head. What has really been driven home is that anyone can make a native mobile app. Mind you, not <em>any</em> mobile app. But, <em>something</em> is possible assuming they’re willing to do the work and keep it simple/pragmatic.</p>
<p>I find building native apps equally exciting and maddening. I makes it clear how much my home is building for the web.</p>
<h2>My favorite design tool (continues to be) the code editor</h2>
<p>I used Figma (or any other drawing tool) precisely zero times to design this app. Yes, I used it to create the App Icon–you got me. All other design iterations happened through code.</p>
<p>I’m one of the weird ones that’s considered the text editor to be their primary design tool for the past 20 years or so. That opinion was held with less conviction even 5 years ago. Now it’s cemented. I’ve come to actively avoid using traditional design tools. This project was one of my biggest projects that was made entirely from a text editor.</p>
<p>Now, I can’t say I enjoyed the editors used for this project, but that’s another story altogether…</p>
<h2>I now directly understand why software is where it is.</h2>
<p>It’s hilariously uncompetitive to charge for an app. This is the kind of thing you “know”, but don’t <em>really know</em> until you experience it first-hand. Which sucks–and explains a lot.</p>
<p>Selling an app–for real, upfront money–is an uphill battle. I’m not arrogant enough to assume that’s the primary reason why my apps aren’t flying off the digital shelves. But it’s hard to ignore that $2.99 is infinitely more expensive than free. And, look I get it. Why pay for something that could very likely suck. Especially when there are hundreds of free options available. There’s no reason to believe my app is worth paying for, or even better than the free alternatives. It’s a leap most aren’t willing to take.</p>
<p>It’s not a coincidence that the overwhelming majority of apps made available are free. But they aren’t–which readers of this blog likely know. A lot of people in the world prefer to live under the belief that there’s such a thing as a free lunch. And perpetuating that belief to extract money is <em>really fucking complicated</em>. A lot of the software that we use on a daily basis <em>could be</em> pretty simple. It’s the business angle that makes that reality impossible.</p>
<p>It takes a certain kind of genius to develop the mainstream platforms we see today. But it’s resulted in a lot of unhappiness. When all the bullshit is set aside–when an app can just be an app instead of a service–things get simpler. Simple enough that a dumbass like yours truly can actually make something. Twice.</p>
<p>I’d rather be a good dumbass than an evil genius.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Writing about making a writing app]]></title>
            <link>/posts/writing-about-making-a-writing-app</link>
            <guid isPermaLink="false">/posts/writing-about-making-a-writing-app</guid>
            <pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[What could possibly go wrong?]]></description>
            <content:encoded><![CDATA[<h2>Prologue: I’m doing it</h2>
<p>I like writing. It took about three decades to come to that conclusion. I’m still not good at it–and I probably never will be. But I still like it.</p>
<p>So, of course, I have opinions on writing software. I’ve tried countless and enjoyed few. I’m the first to admit that it’s a hard nut to crack. So many people want so many different things. Many of the things some people want are what others specifically don’t. The app I’ve had the longest run with is iA Writer–mainly because it’s objectively good. The app has been in active development for what feels like forever (in internet years). Its business model isn’t exploitative. There’s just a lot to like.</p>
<p>But, because I’m me, I have my issues with it. Not so much with what it doesn’t do. It does too much–for me. And, yes, I’ve tried a numerous distraction-free, minimal writing apps. And many are just fine. But they’re either not minimal enough, or minimal in the wrong ways–again, for me. So, because I’m me and insufferable, I’ve decided to make a writing app that does just the right amount and is minimal in all the right ways–for me.</p>
<p>And just to make it more laborious, I’ve decided to write about the process of making it. This is something that’s going to take time. It should. I’d like to get this right–mainly because I want to use it. My hope is that writing about this will help straighten out my thinking. The straighter the thinking, the less code I need to write/rewrite. Also, I think it’s important to live through the jank of early prototypes. Trudging through crap strengthens one’s resolve to improve.</p>
<p><img src="https://pjonori.blog/posts/writing-about-making-a-writing-app/early-screenshot.png" alt="A screenshot of my writing app in what is hopefully it's worst form"></p>
<p>So, this is the first in what should be many, many, many updates. Let’s see how this goes…</p>
<h2>Doing the basics</h2>
<p>A little can do a lot. I spent a little time cleaning up the spacing, line height and more general massaging of the editor experience. I can say with enthusiasm that my editor is unabashedly mediocre.</p>
<p>The current build is working for iPhone, iPad and Mac. I’m primarily using the editor on my laptop and I can already tell that the interface is going to have to take some pretty sharp departures between iOS and Mac OS. How much? Uncertain, but there’s going to be a considerable UI shift.</p>
<p>But, damn, part of me thinks I could probably tolerate what I have for a decent amount of time. Except for one thing… Which I’ll discuss next time.</p>
<p><img src="https://pjonori.blog/posts/writing-about-making-a-writing-app/entry-2-editor.png" alt="A screenshot of the editor with some visual refinements"></p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Planning and design systems–how much time you got?]]></title>
            <link>/posts/design-system-planning</link>
            <guid isPermaLink="false">/posts/design-system-planning</guid>
            <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><img src="https://pjonori.blog/posts/design-system-planning/crap.svg" alt="A Gnatt chart the spells out the word crap."></p>
<p>There are few things more impactful than good planning. Planning isn’t all that different for design system teams. But I do think is plays a more important role. Design systems are playing with a different time scale than feature teams. Systems think in years whereas feature teams focus more on immediate outcomes. Feature teams are most autonomous in their focus. Design systems thrive on connections.</p>
<p>It&#8217;s those differences that&#8217;s made me such a stickler for planning within a design system team. <strong>I’m no expert at planning.</strong> It’s been one of the most humbling rituals I’ve had the “pleasure” to be a part of. I’ll be in learning-mode until the day I stop working. This post doesn’t have absolute answers. I’m writing this because people in design systems don’t come from a planning background. But we’re on the hook to deliver one nonetheless. I’m hoping this may help someone that’s heading into their first planning cycle.</p>
<p>No one can/should tell another team how they should choose what to plan or prioritize. Especially me. The purpose of this post is focus on _how organizing and constructing your plan.</p>
<h2>Things I’ve picked up along the way</h2>
<p>I’ve learned a lot about planning. The hard way. Not all lessons learned are <em>correct</em>. Your mileage will vary.</p>
<h3>Define work around projects, not people</h3>
<p>It’s easy to have each individual define their focus on defining their own work. I prefer focus thinking around projects.. Teams grow, teams shift, teams can get help from other teams. Define for the work to be done independent of personnel. Once defined, it’s easy to prioritize/scope based on team capacity. Overflow can be cut, planned for the next cycle, or pitched as need for more headcount.</p>
<h3>Build in a capacity buffer</h3>
<p>Support is a big part of what design system teams do. Support takes time. That time takes away from other work. You&#8217;re going to have a big math problem, if you’re planning based on 100% capacity.</p>
<p>In an ideal world a design system team has a measurement of how much time support takes up. Subtract that measurement from the team’s capacity when planning. If that measurement doesn’t exist, ballpark it. If the team is allergic to ball-parking, set aside 20%.</p>
<h3>Planning complexity scales exponentially based on team size</h3>
<p>What works for a team of 5 will begin to buckle at a team of 10. And it’s a hell of a lot more than twice as hard…</p>
<p>The less defined process, roles and responsibilities are, the harder planning will be. Trust me, I know by experience.</p>
<h3>Aim to be cycle ahead or behind</h3>
<p>Design system work benefits from staying out of the product development fray. It’s difficult, if not impossible, for a design system team to keep up with the pivots and shifts of feature teams. It’s equally difficult for feature teams to wait on a system team to deliver a systems-based solution. Those teams think in an ASAP-level–systems teams can&#8217;t.</p>
<p>To combat this, design system teams should either:</p>
<ul>
<li>Plan a cycle ahead to enable feature teams to hit the ground running</li>
<li>Plan a cycle behind to systemize common patterns once the dust settles</li>
</ul>
<h3>Under-promise</h3>
<p>Teams often plan based on what the design system team commits to delivering. Meaning, if you say you’re going to deliver that button component, you <em>better damn well deliver it</em>. A design system team’s goals should be attainable–barring unforeseen circumstances.</p>
<p>Feature teams <em>heavily</em> rely on design systems. When a design system commits to work, there’s a good chance another team has planned around that. Missing a commitment can dramatically impact a feature team’s ability to deliver. It’s critical to make good on commitments. Better to underpromise on what’s possible to make sure it gets done. Overdelivering is always an option.</p>
<h3>Over-communicate</h3>
<p>Did I mention feature teams rely on design systems? That reliance means they need to be constantly kept in the loop. Teams need to be aware of what the design system team plans to take on. They need to be aware of progress. They should be aware when milestones are hit.</p>
<p>Also, plans change. Shit happens. When (not if) those things come up, it’s critical that everyone who relies on the system is aware. Ideally sooner than later.</p>
<h3>It’s not a democratic exercise</h3>
<p>This doesn’t mean that folks shouldn’t aim for consensus, but it isn’t necessary. The people doing the work outvote the team members who aren’t. Unless that work impact others’–that&#8217;ll need coordination.</p>
<p>Planning can be fluffy–especially early in the process. It’s critical to give everyone on the team the ability to push back. Every, “why?” should damn well have an answer. Or at least a hypothesis. If not, that&#8217;s a sign to go rethink decisions.</p>
<h3>There’s never enough time for it</h3>
<p>So make sure to constantly refine your planning process. Starting by <em>documenting your planning process</em>. I’ve also begun to consider planning a nonstop process. The second the team has landed its upcoming plan marks the moment to start organizing the next.</p>
<h3>Plans almost always falls apart to some degree the second the rubber hits the road</h3>
<p>Don’t be precious. It’s important to stick to the plan–until it’s not. What’s the turning point? That’s for everyone to figure out on their own.</p>
<h2>How I currently structure plans</h2>
<p>Most companies I’ve worked for use OKRs to structure plans. They’ve worked fine for me. I&#8217;ve made some small tweaks the based on experience and preference. There’s nothing wrong with OKRs–hell, they could be better than my tweaks. So take my structure as either a gentle consideration or cautionary tale.</p>
<p>Projects follow a structural hierarchy of: Long-term direction > Theme > Objectives > Projects > Tasks. Each child supports the parent with greater fidelity and concrete definition.</p>
<h3>A brief detour on product owners</h3>
<p>The following section discusses ownership of responsibilities–with product owner being frequently mentioned. Who should the product owner be? Whoever is willing/able to own the direction of the roadmap. It can be a product manager, a people manager or a lead designer/engineer. Any/all can work. It&#8217;s down to culture/people/capabilities.</p>
<h3>Long-term direction</h3>
<p>Everything starts with a long-term direction. It’s both the least and most required part of planning. The long-term direction is your design system&#8217;s roadmap of roadmaps. It charts a multi-year course for where it plans to go and what to achieve. The product owner drives long-term direction with input and influence from senior leadership.</p>
<p>I usually aim for a four to five year plan. I find the long-term direction to be the ideal altitude to work with senior leadership. It&#8217;s great for strategic input without disrupting the team&#8217;s day-to-day work.</p>
<p>The long-term direction won&#8217;t perfectly lay out what each year will look like. That’s impossible. The goal is to form a point of view to work towards–knowing that point of view will constantly evolve. This point of view helps the team understand how each planning cycle intends feeds into the next.</p>
<p>The fidelity and accuracy of the roadmap drops exponentially over each year. That’s expected. Again, the long-term direction’s purpose isn’t to be accurate, it’s to define an <em>actual direction</em>.</p>
<p>Planning starts with a review the long-term direction. That review helps inform the plan&#8217;s upcoming theme.</p>
<h3>Theme</h3>
<p>A theme is used to help focus a team’s work for the cycle. The theme is typically defined by mangers/product owners on the design system team. It’s guided by company business goals and senior leadership. A planning theme provides a lens to put all projects through and a filter for efforts that are on the fence. Not all work will fall perfectly under a theme, because reality doesn’t work that way. That’s absolutely OK.</p>
<h3>Objectives</h3>
<p>Objectives represent a distinct goal in service of the planning cycle’s theme. Each objective contains a collection of projects that feed into the goal. Objectives can be defined by the product owner or be driven by senior team members. All team members should have heavy input in the definition of objectives. Some objectives won’t map to the plan’s them. As mentioned, that’s OK. Just be honest about it.</p>
<p>I like objectives to have their own goal/success measure as I find this a better altitude to report upward. I also think it’s important to show how all the projects in an objective map to an single definition of success. This creates extra work from how I’ve seen others set up OKRs, but I’ve found it useful.</p>
<h3>Projects</h3>
<p>Projects are what I use instead of key results. I find it easier to wrap my head about this mapping. Projects are where the rubber hits the road. I like using projects because they’re exactly what the name suggests. They’re a logical chunk of work with clear boundaries that cleanly map to the objective it’s a part of. Projects are typically defined by the product owner and people who&#8217;ll work on the project.</p>
<p>Each project in the objective should also have a clear goal/success measure(s). Those goals should clearly feed into the success of its objective’s goal.</p>
<p>Projects are defined through a one pager or requirements doc that outlines <em>what the hell you plan to do</em>. A project should have an owner who’s responsible to drive the work forward. The project&#8217;s requirements doc are written by the product owner and/or the project owner. At the very least, the person who owns the project needs to be heavily involved.</p>
<h3>Tasks</h3>
<p>Once each project has definition and goals, the job is to scope out the work as granularly as possible. Ideally, down to the task level. This is akin to pre-visualizing a project.</p>
<p>The project owner should work with all involved to define tasks. Tasks have an assignee, rough level of effort and requirements. The product owner and the project owner weigh in on prioritization and requirements. Assignees need to own the level of effort.</p>
<h2>How does this usually play out?</h2>
<p>Planning follows a pretty straightforward process. First define the high-level direction. Then scope out the tasks to support that direction. Next, sequence the work out across the length of the roadmap. Afterwards, you tweak the roadmap based on capacity and dependences. Then you use any overflow and learnings to pre-plan the following roadmap. Lastly, you socialize it across the company.</p>
<h3>Defining</h3>
<p>The team works to set a theme for the roadmap and then work to set objectives. The goal of this step is to make sure we’re all bought in to spending a large part of our year working on what’s suggested. I usually stub out skeleton projects to act as a conversation starter. The skeletons don&#8217;t need requirements or finalized goals. They only need to kick help start the conversation. This high level definition is shared with the team for review and spirited gut-checks.</p>
<h3>Scoping</h3>
<p>Once the high level plan has been established, the team goes into scoping mode. The goal of this step is to get all the work to be done defined, prioritized, assigned and level of effort estimated. This is the onerous project of defining all the work that needs to be done for each project. The more granular the tasks are the defined, the better. Have I mentioned it’s a lot of work? Because it is.</p>
<h3>Sequencing</h3>
<p>Once tasks are created and assigned, it&#8217;s time to map them across the planning cycle. Each team member sets an order and rough start dates for their workload. This step makes sure projects are scheduled accordingly when there are hard deadlines. It also ensures that work flows in the right order. Meaning all design tasks need to be sequenced ahead of development. But most of the time, each team member is able to map this to their own personal roadmap based on how they prefer to work.</p>
<h3>Rejiggering</h3>
<p>Once tasks are scoped and sequenced, it’ll be clear what the team has time for and what’s got to go. Tasks that can’t fit within capacity are cut and project scope is reduced. Objective and project goals are adjusted to reflect what’s been removed.</p>
<h3>Future planning</h3>
<p>What do you do with all that work that got cut from the current plan? You log it for the next planning cycle. The scope and goals set for the upcoming roadmap should impact the next roadmap. And knowing what will have to spill over is a big part of shaping that future outlook.</p>
<p>So don’t feel like all those created tasks that were cut was a waste. Quite the opposite–it’s helping the team prepare for the next planning cycle.</p>
<h3>Evangelizing</h3>
<p>Once the roadmap is set, it’s time for the road tour. A design system’s roadmap has the potential to impact so many teams. So, it’s important to plan and roadmap as visible as possible. Share it in meetings. Share it in email. Share it on Slack. Share it at happy hour. Share it over and over. People should be tired of hearing about your plan.</p>
<p>Our team typically posts the planning document which contains a all the gory details. It lays out the theme, objectives, projects and tasks. It&#8217;s paired with a Gantt chart that shows the sequencing of work by each project. All this is capped by a summary document which outlines the plan in a conversational tone. I’ll also sometimes go as far as reaching out to teams to see if they have questions/concerns.</p>
<p>Without fail, something is going to come up a week after planning ends. Teams will then ask why the design system team can’t take on a specific project. That’s when you point back to the plan that everyone’s tired of hearing about.</p>
<h2>Planning is a lot of work</h2>
<p>Make no mistake, I don’t enjoy planning by nature. This isn’t what I get out of bed for. But good planning is can turn a team clinging on for dear life into one that’s hyper-effective. As much as I recoil from the tedium of the work, I <em>love</em> the outcomes produced. Like many other things that are hard work, the payoff is worth it.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Buyer beware]]></title>
            <link>/posts/buyer-beware</link>
            <guid isPermaLink="false">/posts/buyer-beware</guid>
            <pubDate>Mon, 05 May 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I’m going to Config this year. It’s my first time. These kinds of events aren’t my wheel house. I don’t like being sold and I’m not into dog and pony shows. Config’s Venn Diagram of those two would be a perfect circle.</p>
<p>To be clear, I don’t blame Figma. This is their job. We, the consumer, aren’t holding up our end of the bargain. The job of the business is to sell. To pitch everything with the rosiest tint possible. To make their product look irresistible. The consumers’ job is to be aware of this and act correspondingly. That&#8217;s not happening–at least not enough. Here&#8217;s what I observe far too often: A company pitches its wares. Customers squee in excitement at what will absolutely not disappoint in any way whatsoever. Think Cybertruck. Think Humane. I could go on.</p>
<p>Again, this isn’t a slight at Figma. It’s a slight at naive buyers. This naivety does both parties dirty. I saw untethered hype first hand at InVision. The design community was emotionally and irrationally bought in at a level that defied reason. From a company that at no point earned that right. That delusion allowed a few at the top to believe what they made was all they thought it was. It wasn’t.</p>
<p>A skeptical customer is a gift. And we, the customers, are being miserly. This isn’t a call to mob up and blast negative absurdities on social media. It’s to just do the job of a customer. Brush the sales pitch aside. Reserve judgement. And once you have enough information, tell them what you expect for what they’re asking.</p>
<p>I&#8217;d say there are two logical conclusions to make from any demo presented at conference like this:</p>
<ol>
<li>Interest is piqued, but prolonged first-hand experience is needed to make a decision</li>
<li>Not interested, but prolonged first-hand experience is needed to make a decision</li>
</ol>
<p>Tools are not an impulse purchase. They’re not a candy bar at the checkout lane. Something like Figma is a significant investment of your time and money. Don’t just consume the pitch. Ask questions. Find chinks in the talking points. Constantly ask if what you’re seeing is what’s most valuable to you. Check your emotions, check the vibe, check the atmosphere and remember that you’re being sold.</p>
<p>And respond accordingly.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design system documentation is essential–as long as it’s good]]></title>
            <link>/posts/design-system-documentation</link>
            <guid isPermaLink="false">/posts/design-system-documentation</guid>
            <pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Documentation, of all things, is a contentious topic within design systems. Never in a million years would I expect something as boring as documentation to get folks up in arms. Some people (like me) think it’s essential. Others think it’s useless.</p>
<p>Part of me thinks this is due to modern-day internet hyperbole. If something isn’t the best thing ever, it’s the worst thing ever. Another part thinks this is due to people’s experience with documentation.</p>
<p>As mentioned, I think documentation is essential. Specifically, I think <em>good</em> documentation is essential. You’ll have my full agreement on the worthlessness of <em>bad</em> documentation.</p>
<p>So I thought I’d write a short-ish articulation of what good documentation looks like and what it can do.</p>
<h2>Good documentation is short, simple, structured, and actionable</h2>
<p>Writing a bunch of stuff down may technically be documentation. But it doesn’t mean it’s good. Getting to good is hard work. Below are the qualities necessary to get to <em>good</em>.</p>
<h3>Succinct</h3>
<p>Documentation should not be flowery or poetic. Each word should have meaning. Use the fewest words needed to get the point across. It can be tempting to “fill the space” to create the feeling of rigor. No one benefits from that approach.</p>
<h3>Predictable</h3>
<p>A reader should know how to consume design system documentation in less than a day. The structure/format of content should be logical and consistent. Guidelines and best-practices will always evolve. But readers should know what to expect to see when they look for information.</p>
<p>As an example, component documentation should lead with, what it is, what it does, and what it’s for. Order the remaining content should by what readers need to know next. The goal should be to get readers using the component <em>as quick as possible</em>.</p>
<h3>Concrete</h3>
<p>Design system guidance must be explicit, objective and not subject to interpretation. Phrases like, “Use sparingly” or, “Avoid when possible” are subjective. What does “sparingly” mean? What’s the definition of “when possible”? Many words can have wildly different individual interpretations. The goal of documentation is to replace individual interpretation with shared definition. If a component should only be used once on a surface, say <em>that</em>.</p>
<h3>Exact</h3>
<p>Words in documentation must be used precisely. Use the same words to mean the same thing. For example, it’s problematic to use “quality” and “high craft” to reference the same subject. As mentioned, words have different individual interpretations. It’s already difficult to align on the meaning of one word. Don’t make it harder by using other words. Yes, this will make the writing repetitive. That’s a feature, not a bug. Repetition helps build familiarity.</p>
<p>Similarly, use different words to mean different things. Terms like “font”, “typography”, and “text” all have distinct meanings. Resist glomming terms together for the sake of convenience.</p>
<h3>Approachable</h3>
<p>Documentation doesn&#8217;t need fancy words. Use clear, simple language. Our work isn&#8217;t a science, so our language doesn’t need to be scientific.</p>
<p>Small words can have big meaning. The harder it is to read documentation, the fewer people will read it. That’s a basic, but important truth.</p>
<p>In a similar vein, avoid jargon and acronyms. Don’t make up new words that don’t need to be made up. Remember that a company’s dialect is not
inherently understood–meaning it represents a dependency for people to understand the documentation.</p>
<p>A a rule, a junior-level employee should be able to understand a design system’s documentation.</p>
<h3>Encapsulated</h3>
<p>Individual guidelines should be self-contained and understandable on their own. The reader shouldn&#8217;t have to read the entire Button component’s docs to know when to add an icon. Each specific guideline should be able to guide the reader on its own. Readers need to be able to skim and digest documentation piecemeal.</p>
<p>Principles for a design system can be helpful. But they should be able to perform basis tasks without reading them.</p>
<h3>Actionable</h3>
<p>People’s relationship with documentation is transactional. A person needs to know how to do a thing–they read the documentation to find out. 99% of the time they are not interested in design principles or mission statements. They <em>just</em> need to know how to do a thing.</p>
<p>Documentation should be tuned for action. Remove preamble. Frame guidance in a way that enables people to act with certainty in the least amount of steps.</p>
<p>Similarly, only telling readers what not to do* isn’t actionable. People aren’t interested in what _not* to do. They’re need to know what <em>to</em> do. Documentation will not have all the answers. But it’s important for documentation to avoid being the “Book of Don’ts”. “Don’t dos” should be paired with “…do <em>this</em> instead”.</p>
<h3>Justified</h3>
<p>Documentation should be able to answer, “But, why?” Recommending a reader not do something without justification is not actionable or educational. It does not guide the reader to better understand how the system works or how to interpret its rules. Including rationale is critical to help readers understand the system&#8217;s underlying logic.</p>
<p>Best practices are a clear area of opportunity for providing rationale. Ideally this rationale is rooted in evidence with cited sources. Sharing this information is a window into how the system works. It’ll drive a deeper understanding.</p>
<p>90% of the time this info will not be needed or desired. It can counter-intuitively make the documentation less actionable. To remain succinct, this may mean including footnotes or linking to an appendix. Receipts should be available when readers come asking for them.</p>
<h3>Definitive (in a chill kind of way)</h3>
<p>Remember that documentation is <em>guidance</em>. It’s a recommendation based on <em>known</em> use cases and needs. The unknowns are just that. Design system documentation will <em>always</em> be imperfect and incomplete.</p>
<p>In that spirit, the tone of documentation should always reinforce that reality. Recommendations are <em>just that</em>. They are not a dictate or an ultimatum. Words like <em>must</em> should be used with extreme care and precision.</p>
<h2>Good documentation can help transform the way work is done</h2>
<p>Yeah, those are strong words. But I believe them–strongly. Below are all things (except for one) that I’ve seen documentation do with my own two eyes.</p>
<h3>It forces a point of view</h3>
<p>A design system team without documentation is dangerous. It gives them room to waffle. Today, only one primary button on a surface is allowed. Tomorrow, maybe not. Without documentation, a point of view can change at any moment. With no accountability.</p>
<p>Design system consumers deserve a clear, stable point of view on how to use it. They should be able to push back when feedback doesn’t align with documented guidelines. Documentation keeps a design system team honest and answerable to those who use it.</p>
<h3>It improves the thinking behind the system</h3>
<p>I believe writing documentation is valuable even if no one reads it. Look, it’s been said a million times–the act of writing fortifies the thinking behind it.</p>
<p>A design system’s component or pattern isn’t complete until it’s been documented. Documentation is a design system’s mental QA. It’s one thing to think a component or pattern’s logic works in your head. It’s another to prove it by writing that logic out.</p>
<p>Writing documentation has resulted in more component revisions than I can count. The process is worth it for that reason alone.</p>
<h3>It keeps the design system team aligned</h3>
<p>It’s naive to think the entire design system team shares the same understanding of every token, component and pattern. Quite the opposite–I’d say there’s far more misalignment than there’s alignment on the average team. Documentation can correct that <em>quickly</em>.</p>
<p>Documentation acts as a team’s handbook and rallying point. It helps team members catch up on areas they have less exposure to. In times of disagreement, it can help ground conversations. Docs can be the mental glue between all team members.</p>
<h3>It keeps thinking available when people aren’t</h3>
<p>A lot of design system teams rely on Slack or Teams to answer questions as they come in. It’s common for those mediums to be the de facto form of documentation. Which, I’ll say, is the least efficient form of documentation possible. But on top of that, what happens when the person answering the questions isn’t available?</p>
<p>The thinking behind a design system is–far and away–its most valuable piece. It’s a huge risk to for all that thinking to stay bottled up in one person’s head. That person will be too busy to respond. They’ll get sick. They’ll go on vacation. Those moments represent blockers to anyone with questions about the system.</p>
<p>And someday, that person will leave. At which point that knowledge is gone <em>forever</em>.</p>
<h3>It creates a common language</h3>
<p>Design system docs help folks understand a product’s design/engineering best practices. Duh. But it also creates shared terminology and definitions. Which allows people to effectively communicate.</p>
<p>It’s hard to have conversations when people use different words with the same meaning. Or the same words with different meaning. A component with different names between design and code can screw things up big time. Take a guess at what shines a light on issues like that?</p>
<p>Words matter–now more than ever. Documentation produces a shared set of words to help generate shared understanding.</p>
<h3>It levels the playing field (maybe)</h3>
<p>This one’s a little aspirational and admittedly not proven. But I believe in it nonetheless. Documentation can be a (hypothetical) leveling agent within organizations. It’s far too common for decisions to suffer from highest-paid-opinion-In-the-room-syndrome. I see documentation as a way for people to fortify their decisions to those above them.</p>
<p>Will this always work? No. Will it work the majority of situations? Probably not. But even if it works on occasion, that’s damned valuable.</p>
<p>Naive/idealistic? Guilty as charged.</p>
<h3>It reduces team overhead</h3>
<p>Design system support is as important as it is costly. Make no mistake, support is a key part of a design system’s success. But support doesn’t need to be only handled by humans.</p>
<p><a href="/posts/everybody-reads">People do read</a>. Good documentation <em>is</em> read. Every question documentation answers is one that a person doesn’t. I’ve seen cases where growth in docs usage coincided with decreases in support volume. Cases–as in plural.</p>
<p>That decrease in support is time saved. And that saved time is free to apply elsewhere–like improving the system. Or writing <em>more</em> documentation. Time is always money. Good documentation prints it.</p>
<h3>It acts as a feeder for AI</h3>
<p>Yeah, I said it. I’ve yet to see AI perform effectively in typical design systems work. I remain uncertain what role it will play within design and engineering. But I am certain that design system documentation is an <em>ideal</em> source to train LLMs. Those who are pursuing AI in their internal processes should be documenting.</p>
<p>This is an area I continue to explore with mixed opinions. But it shows enough promise to keep chipping away at it with interest.</p>
<h2>People read good stuff. So write good stuff.</h2>
<p>There may come a day where humans invent a better form of information transfer than written text. I&#8217;ll back off this crusade once that day comes. But it ain&#8217;t here yet.</p>
<p>Until then, take the time to document your system.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Maybe this is design technologists’ time to shine]]></title>
            <link>/posts/design-technologists</link>
            <guid isPermaLink="false">/posts/design-technologists</guid>
            <pubDate>Sun, 30 Mar 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I’ve had a weird career. And before that, I had a weird education. I went from majoring in computer science to graduating with a degree in Visual Arts. I then entered a job market that was in free fall and not very interested in graphic designers. I decided paying rent was pretty important, so I dusted off my dev skills to become a front-end coder. I didn’t give up on design though. I would take on personal projects in my free time. Strangely enough, there weren’t any engineers begging to build my ideas. So it was up to me to suck it up and figure it out. Next thing I knew, I was a design technologist. In 2004. We were a rare breed.</p>
<p>Twenty years ago I said, “Ten years from now, design technologists will replace the software design role”. My bad. I maintain the opinion that design techs are the ideal role for making software. They have a fuller understanding of the software medium. That makes them more capable to design and build for it. That all seems logical in my mind. But people and society aren’t logical. Corporate America <em>definitely</em> isn’t logical. And so the hybrid role has continued to tread water–quite literally between the margins.</p>
<p>My belief in the practice has not wavered. But I had lost confidence that it would take off beyond isolated pockets. That <em>may</em> be changing due to market conditions and advancements in technology. And so I’m dusting off my optimism to discuss what makes this role so special and what qualities I look for when hiring.</p>
<h2>The design technologist role is a wide spectrum</h2>
<p>It’s important to note that design technologists come in many shapes and sizes. It’s easy to fall into the trap of thinking of them as engineers who like to dabble in design. But that’s flat out wrong. Some design technologists are 10% design and 90% engineering. Others are the complete opposite. Most are somewhere in the middle.</p>
<p>The emphasis doesn’t matter–if there even is one. What matters is that there’s a blend of the two skills. Each blend is going to bring its own strengths and weaknesses. But they all bring something valuable to the table.</p>
<h2>This role remains special–and misunderstood</h2>
<p>Yes, I’m biased. Unapologetically. I’ve seen what this role can do and it’s invaluable. It’s also undervalued. They’re typically only half-understood regardless where they exist in an org chart. Design leadership doesn’t get how the engineering skills apply to their org. Engineering leadership doesn’t see how the ability to design is useful for them. This role can feel unappreciated without the right support.</p>
<p>None of that changes that the design technologist brings a whole new set of capabilities to a team. They’re not a partial designer and a partial engineer–they’re a whole other thing entirely.</p>
<h3>Design techs get things done</h3>
<p>People in this role drive results–quickly. It may not be perfect. But it’ll happen. And let’s be honest, a lot of day-to-day work is about getting it done. Their wide skillset frees them to take an idea all the way to final execution with little to no support.</p>
<p>I’ve also noticed a common streak of pragmatism from people in this role. They’re often implementing their own designs. So, they know how uncompromised design can lead to painful engineering. They also know engineering decisions that impact design lead to a crap experience. Design technologists usually aim for the best practical blend of design and engineering. They know usually leads to the best all-round outcome.</p>
<p>On top of being able to go soup-to-nuts, they’re also incredible at filling gaps in projects. If a team is short on dev cycles, they can assist. Need some design support? They can do that as well. Need a little of both, they have that covered. Design techs are blocker killing machines. The flexibility of the role makes them a resourcing dream.</p>
<h3>They improve the ways teams work</h3>
<p>Design technologists’ have an understanding of how the sausage is made on both sides. They know how design impacts engineering (and vice-versa). They know how designers can set up engineers for success (and vice-versa). They also understand how engineers piss off designers (and, again, vice-versa).</p>
<p>They, more than most, know how design and engineering are interconnected. That understanding helps them shape ways of working that benefits all parties. Designers and engineers still struggle to work well together after decades of trying. This skill alone should have teams hiring design techs like their lives depended on it.</p>
<h3>They develop novel solutions</h3>
<p>The <a href="https://en.wikipedia.org/wiki/Law_of_the_instrument">Law of the instrument</a> is the origin of a pretty famous quote, “If all you have is a hammer, everything looks like a nail”.</p>
<p>Pure designers will always try to solve problems with design. Pure engineers will always try to solve problems with engineering. Design technologists by nature have a bigger toolbox.</p>
<p>Sometimes they’ll solve a tricky development roadblock with an alternative design. Other times they’ll fix some design challenge through technology. Sometimes it’s a blend of both.</p>
<p>They have a lot of tools at their reach and it allows them to approach problems differently. This results in solutions that neither a designer nor engineer would even consider. One design tech working on a problem is fundamentally different than a designer and engineer working on that problem in tandem. I wouldn’t say one is better than the other, but they’re absolutely different. And that difference opens up the possibility for original solutions.</p>
<h3>They make connections more specialized people don’t</h3>
<p>Design techs see patterns and make connections that most specialists won&#8217;t. Viewing software creation through a wide-angle lens makes that almost inevitable. Being in more steps of the process shows how one decision impacts every future one. In a way, working as a design technologist is a crash course in systems thinking.</p>
<p>I also don’t think it’s a coincidence that so many design technologists gravitate to design systems. My experience building with reusable code made design systems seem like only reasonable way to make software. It’s impossible to unsee.</p>
<h2>Good design techs are action-oriented, collaborative, and curious problem solvers</h2>
<p>I’ve hired a decent number of design technologists in my time. I’m typically not looking for portfolios or experience with specific tools. I’m definitely not looking for years of experience as a design technologist. I’m looking for a mindset. In my experience, there are certain qualities that thrive in this role. I look for one or more of these when hiring.</p>
<h3>Action-oriented</h3>
<p>Good design technologists bias towards action. They&#8217;d rather beg for forgiveness than ask for permission. In part, they broadened their skillset to avoid being blocked in the first place. They’d rather cut through the red tape and do it themselves than wait.</p>
<p>I’ve never met a design technologist with Initiative as their legal middle name. But it may as well have been for most I’ve worked with.</p>
<h3>Collaborative</h3>
<p>But don’t get it twisted. Sure, they may not want to wait around and do nothing. But the good design technologists are some of the best collaborators around. Their hybrid experience gives them healthy amounts of respect for each discipline. They may not be keen on waiting around. But they’re also typically the first person to want to include folks for different perspectives.</p>
<h3>Intellectually curious</h3>
<p>Design technologists are naturally interested in <em>a lot of things</em>. They see something they don’t know about and want to learn more. Many can be a little like butterflies that need space to fly around where they see fit. I try to give folks in this role a lot of space so they have room to experiment and tinker.</p>
<p>This is often their fuel and their source of greatest value. Some of our teams’ greatest achievements came from a design technologists&#8217; unplanned tinkering.</p>
<h3>Problem solvers</h3>
<p>The defining trait I’ve seen in nearly all strong design techs is an insatiable desire to solve problems. That may sound like a platitude. You may think, “Designers and engineers also want to solve problems”. And you’d be correct. But design technologists take this to another level. The drive to solve problems is the motivator to grow beyond design or engineering. That&#8217;s what got me into this mess. And many others I&#8217;ve worked with.</p>
<p>Design technologists see problems and aggressively want to fix them. That often makes them incredible enablers. They thrive in solving problems other people/teams are facing.</p>
<h2>What’s the future for this practice?</h2>
<p>I don’t know. A part of me continues to think that if it was going to take off, it would have done so by now. But we’re in a cycle of big change. Companies want to do more with less. Engineering orgs in particular seem to be slimming down. AI may not be the magic some are selling, but it’s not completely hype.</p>
<p>We may be heading to a world of dwindling headcount and tools to supplement code creation. We can debate the merits of such a future, but that’s for another day. If that’s in our future, the design technologist could be ready for its time in the sun. And frankly, it’s about damned time.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Naming things in design systems–and why it’s the worst]]></title>
            <link>/posts/design-system-naming</link>
            <guid isPermaLink="false">/posts/design-system-naming</guid>
            <pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>The exercise of naming can easily descend into a mindfuck death spiral. I often joke that every design system conversation devolves into a naming argument. As the years go by, it feels less and less like a joke. I vacillate between naming being performative navel-gazing and the most important part of the job. Given I consider it so critical half the time, I thought I&#8217;d write about it.</p>
<p>I hold extreme opinions on naming because I think there are really effective and equally ineffective ways to do it. The effective ways seem important. The ineffective ways seem like navel-gazing.</p>
<h2>Fun is only fun for the people having fun</h2>
<p><a href="https://gestalt.pinterest.systems/foundations/color/palette#Colors">Gestalt&#8217;s color palette</a> is probably my biggest regret. I consider it a great case study in clever, creative, fun, and <em>horrible</em> naming. I distinctly remember the meeting where everyone acknowledged how much we fucked up. You could literally hear pain in the engineer&#8217;s voice when they asked, &#8220;So I need to type Matchacado every time I want to color something green?&#8221; &#8220;Why not just call it green?&#8221;, was the next question. Which, to be fair, was a damned good question.</p>
<p>Fun names aren&#8217;t as fun as the namers think they are. Don&#8217;t get me wrong, it&#8217;s fun as hell to come up with clever new words. Even when there&#8217;s a perfectly functional existing word available. Pharmaceutical ads may well be the zenith of make-shit-up naming. Where we once had &#8220;General Steel&#8221;, in today&#8217;s marketing-driven mindset we&#8217;d have &#8220;Ferraxa&#8221;. These names are <em>creative</em> (I guess?), but I don&#8217;t think creativity is a good thing when it comes to naming. At least not in design systems.</p>
<p>Anyone reading this who&#8217;s worked with me is rolling their eyes now. I&#8217;ve been public enemy number one for creating stupid names purely for the sake of juvenile humor. Guilty as charged. My case nonetheless stands.</p>
<h2>Clear or flexible (you choose)</h2>
<p>A name should clearly and concisely describe its subject. <em>Dishwasher</em> may be the best name ever invented. &#8220;What’s a dishwasher do?&#8221;, is not a question people ask. A name has succeeded if it&#8217;s self-descriptive.</p>
<p>Concise and clear naming is all fine and dandy to say, but much harder in the realm of systems. Specifically in the realm of design tokens. Tokens are design systems&#8217; magnum opus in masochism. Design tokens defy clarity because they are abstract <em>by design</em>. Tokens shift based on context. Things like color schemes and density settings mean that what was once dark is now light. What once was big is now less big. We can&#8217;t just call a thing what it is, because it isn&#8217;t always the same thing.</p>
<p>How do you name a thing that changes? Abstraction. Terms like light/dark are replaced with negative/positive. Which is fine, but it chips away at clarity. People innately <em>get</em> &#8220;dark&#8221; faster than &#8220;positive&#8221;. Abstraction gives us flexibility at the cost of clarity.</p>
<p>To make things harder, a lot of things in design systems are relative. Think size/color ramps. Sure, we could just name each size its actual value, but what happens when that value has to change? Now that name makes no sense whatsoever. Going back to our friend abstraction, we&#8217;ve historically named ramps in relative terms (e.g., small, medium, large or light, medium, dark). This also sucks. Because what happens when you need to add a value between small and medium? You get the infamous <em>smedium</em>. Too many sizes and you get a bunch of Xs in names (e.g., xx-small, xxx-small, xxxx-small). No one will convince me those are good names.</p>
<p>So, to combat this, we&#8217;ve typically used numeric stops for ramps (e.g., size-100, size-200 and red-100, red-200). More abstraction. This fixes the issue of needing to shunt a size/color in the ramp (size-150/red-150) but it&#8217;s even more abstracted. Meaning it&#8217;s even less clear. Someone tell me what size-100 is. It&#8217;s nothing. In a way, that&#8217;s the point.</p>
<p>In real life, I can call a chair a &#8220;chair&#8221; and know that it will always be a chair. In the world of design systems, a chair could become a sofa, or a table, or a Volkswagen. I know we haven&#8217;t cracked design tokens because they continue to make no goddamned sense. Due in large part to obtuse naming conventions.</p>
<h2>Rules of thumb for naming components</h2>
<p>I don&#8217;t see a world where token naming doesn&#8217;t devolve into said mindfuck death spiral. At least not in the near future. But that doesn&#8217;t need to be the case for other areas of a system. Luckily, many other areas of systems can be much simpler. And it&#8217;s important to lean into that simplicity.</p>
<p>I think it&#8217;s important to have one name–and only one–for a thing. This seems obvious. But different platforms have different names for the same thing. What would be considered a list on Web has been called a table on iOS. There&#8217;s a million of these discrepancies once you get in the weeds. As difficult as it may be, I maintain the opinion that a design system needs to settle on one name.</p>
<p>Once that name is settled, the focus should be short, simple and clear. As few <em>simple</em> words as possible that clearly describe the thing. Mind you, this is <em>deceptively hard</em>. Maybe even <em>deceptively impossible</em>. But a few smart decisions during the naming phase can at least <em>reduce</em> pain down the road. For example, is, &#8220;Loading Spinner&#8221; a good name? What if it&#8217;s redesigned to no longer spin? What about, &#8220;Loading Indicator&#8221;? Well, &#8220;indicator&#8221; is a pretty big word for a pretty small meaning. Maybe, &#8220;Loading Sign&#8221;? What about just, &#8220;Loading&#8221;? Too vague?</p>
<p>Side note, I don&#8217;t think I&#8217;ll ever understand why &#8220;Floating Action Button&#8221; isn&#8217;t called &#8220;Floating Button&#8221;. Aren&#8217;t all buttons, <em>action buttons</em>? Floating Action Button, in particular, sticks in my craw. This overly complicated name led it to become FAB. It committed the ultimate sin of becoming an acronym. A name has failed once it&#8217;s become an acronym. I could go on and on about the blight of acronyms, but that&#8217;s for another day. I&#8217;d argue that naming simplicity is critical solely to avoid being <em>acronymed</em>.</p>
<p>Lastly, names should have decent separation between each other. The more components differ in form/function, the more their names should differ. For instance, “Tag” and “Tab” are pretty damned different components, but the sound <em>really similar</em>. That alone can cause confusion. It doesn’t help when the “G” and “B” keys are so close together. One fat-finger typo and now there are tags where there were supposed to be tabs.</p>
<h2>Think before you name</h2>
<p>I could go on and on about naming in design systems. Suffice to say, it’s important (as much as I can think otherwise). Design systems are many things. Their role as a language may be its most critical. The nomenclature used in a system is what creates common understanding or general confusion. It can bring people together or keep them siloed.</p>
<p>For as critical as naming is, it&#8217;s not always treated that way. Many teams don&#8217;t have people with the background, expertise or even general interest to deftly handle taxonomy. Think twice before you name that component Floating Upsell Card. You may end up regretting it.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[I don’t want your email]]></title>
            <link>/posts/i-dont-want-your-email</link>
            <guid isPermaLink="false">/posts/i-dont-want-your-email</guid>
            <pubDate>Sat, 08 Mar 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I don&#8217;t know who reads this. I don&#8217;t know how they find it. I don&#8217;t know if they&#8217;ll ever come back. I don&#8217;t know a damned thing. And that&#8217;s by design. I value my privacy and by extension, I value others&#8217;. That&#8217;s exactly why I don&#8217;t have newsletters. The last thing I want is someone&#8217;s email.</p>
<p>This blog is a place to get things out of my head. I write for myself. Putting it on display provides just enough social pressure to give it <em>that much more</em> care. But it&#8217;d be fine if it was read by no one. I won&#8217;t lie–that wasn&#8217;t always the case. It took me a lot of years to grind that desire out of me.</p>
<p>Social media platforms were supposed to the way for anyone to grow an audience. For many, dare I say <em>most</em>, the goal was simply to be seen. To fulfill a need to feel validated. And man, has social media preyed on that need.</p>
<p>Speaking of preying. Social media has also preyed on the tale as old as time: &#8220;you can become the next big thing&#8221;. Many folks got caught in the trap that they <em>just might</em> be able to make a living by making content. And just like every other road to fame, 99.9% of them didn&#8217;t.</p>
<p>What was once a snowball&#8217;s chance in hell is now even harder. We&#8217;ve seen a slow-motion rugpull for the past decade. Platform algorithms increasingly have more sway on content consumption. A creator&#8217;s &#8220;audience&#8221; means less than ever. Now that 99.9% looks more like 99.999%.</p>
<p>In response, we&#8217;ve seen a small, yet steady push towards independence. Content creators are experimenting with newsletters to distribute content. I get it–newsletters give creators the ability to have a direct line to their followers. No algorithms, just a direct line.</p>
<p>The problem is, it&#8217;s still flawed. First, there continues to be a middleman. There seems to <em>always</em> be a middleman nowadays. It&#8217;s easy to see for plaforms like Substack because <em>they are the middleman</em>. And that middleman can change their rules at a moment&#8217;s notice. Even &#8220;independent&#8221; newsletters use services like Mailchimp or whatever other newsletter services exist. Those too are middlemen that can also change the terms as they see fit.</p>
<p>The second and more essential issue is that the overwhelmingly vast majority of creator will <em>never</em> make real money. All the while, the people trying to consume content deal with layers, and layers, and layers of bullshit. Privacy issues, invasive advertising, increasingly aggressive dark patterns. All to make 30 cents in revenue. Which, begs the question, &#8220;Why even try?&#8221;</p>
<p>I understand the desire to grow an audience. I also understand the desire to know who your audience is. Even more so, I understand the desire to be in more control of your own destiny. But that desire comes with some serious strings. And when you cut those strings, things get <em>incredibly</em> simpler for everyone.</p>
<p>I&#8217;ll never grow a following or make a dime from this blog. That&#8217;s just fine. It keeps things clean and easy. I have a simple site that I pay nothing to host. I have no aspirations beyond what this currently is. I write the things I want to write. People may read it. If they do, awesome. If they don&#8217;t, whatever. It&#8217;s freeing.</p>
<p>But who cares about how I feel. More importantly, this approach respects readers. They&#8217;re not tracked. They&#8217;re not bothered with ads. There are no stupid GDPR labyrinths. None of their personal information is stored. They come, they read, they leave. That&#8217;s it.</p>
<p>I don&#8217;t think it&#8217;s wrong that people want to have their content seen. It&#8217;s completely logical to want a payoff for what they create. None of that in itself is &#8220;bad&#8221;. But in our current day and age, it can come with some pretty nasty consequences. We should at least go into that with our eyes wide open.</p>
<p>I don&#8217;t want anyone&#8217;s email. Even more so, I don&#8217;t want anyone to <em>want to give me their email</em>. Frankly, I want us to <em>give less</em>.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[The existential challenge of design system team morale]]></title>
            <link>/posts/design-system-morale</link>
            <guid isPermaLink="false">/posts/design-system-morale</guid>
            <pubDate>Wed, 26 Feb 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2>What the hell do I know?</h2>
<p>Not much to be honest. I’ve been working in this industry for a long while now and I still don’t have a damned clue. But, as the years go by, I don’t think many people do either. Meaning most of us are all just figuring this out together.</p>
<p>I don’t have answers, but I do have experiences. That’s all I can share. These experiences are not profound. They’re not new. There’s no guarantee they&#8217;ll work for anyone else.</p>
<p>But I’m sharing them anyway. Because they may be useful for someone. Someone like you.</p>
<h2>Our industry is not in a good place</h2>
<p>Welcome to 2025. Layoffs are happening every other day. Companies are shifting values with shifting administrations. The future seems more opaque than ever.</p>
<p>People are frustrated. To say the least. Which means morale is more fragile than ever. This is no longer something we can “take seriously” in the air quotes kind of way. It’s become existential.</p>
<h2>Design systeming is really hard</h2>
<p>And to make matters worse, the role of a system designer is just <em>really</em> challenging. Common issues include:</p>
<ul>
<li>Chronic reactivity to requests and support needs</li>
<li>Being overwhelmed by too much to do in not enough time</li>
<li>Challenges with knowing how people use the system</li>
<li>A general sense of their work/role being misunderstood and unappreciated</li>
</ul>
<p>And much more! But you get the gist.</p>
<p>Burnout has become a rite of passage. It’s (sadly) become a problem to manage versus avoid. Every design system team I’ve worked on had these challenges. And I know my experience is not the exception. We’re all in good company. Or, maybe, bad company.</p>
<p>Design systems are hard. Because the work of design systems is hard. But guess what? So is every other discipline of design and engineering. Just hard in different ways. It’s important to remember everyone is going through challenges.</p>
<p>Avoid the “us” versus “them” mindset. Trust me, that’s not a healthy place to go.</p>
<h3>Morale is a hefty topic that can fill a book</h3>
<p>And all I have is this blog&#8230;</p>
<p>This post won&#8217;t cover everything–because it can&#8217;t. So much of morale is squishy and hyper situational. My personal experiences aren’t going to be useful to someone’s specific situations. People write whole books on this topic. I have not, nor never will, write a book. Especially about this.</p>
<p>But if there’s one thing my experiences have taught me, it’s that morale can’t grow on a shaky foundation. I might be able to help with that.</p>
<h3>It&#8217;s called work for a reason</h3>
<p>I don’t think work is supposed to be fun. I think parts of it can be. But a lot of work is, well, <em>work</em>. And other parts can be downright <em>misery</em>. Compliance training isn’t fun. Corporate jargon isn’t fun. Mandatory fun isn’t fun.</p>
<p>When I think of morale, I don’t think fun. I think morale is made up of more subtle emotions. Things like fulfillment, security, trust, stability, hope. They&#8217;re less in your face. They&#8217;re fragile. They&#8217;re important.</p>
<p>Those are what I’m aiming for when building morale.</p>
<h3>Boring is good</h3>
<p>I think our industry undervalues boring things. But my goal as a manager is to make people’s day to day as boring as humanly possible. Not “boring” as in mundane. Not soul-crushing. But “boring” as in obvious, consistent, and predictable.</p>
<p>We’re living in an “exciting” age. Nothing about today’s world is boring. Everything is changing. Yesterday’s assumptions are today’s uncertainties. We’re waking up to something new everyday. And many, <em>many</em> of us want off the fucking ride.</p>
<p>That level of unpredictability makes life (and work) difficult. I can say with increasing confidence there&#8217;s a growing consensus yearning for more boring in their life.</p>
<h3>Design systems are boring</h3>
<p>I think a little boring is good for every team, but I think it’s essential for design system teams. Because I think good design systems are boring by nature. They just work. They’re reliable. No surprises. No excitement.</p>
<p>Design systems are institutions. They&#8217;re your local utility. Think of about the last time you turned on your water faucet. You didn’t ponder what would happen. You just expected clean, running water. A surprise would&#8217;ve been a failure.</p>
<p>And that’s one of the many values design systems can bring. Like many other institutions, they can establish stability. But it’s hard for a design system to <em>establish</em> stability when its team <em>isn’t</em>…</p>
<h2>Discipline, focus and patience as the foundation for morale</h2>
<p>Strong team morale is built on being able to work effectively. I don’t think you can disconnect impact and team sentiment. So, I don’t.</p>
<p>My focus to maintain healthy morale is to maintain a healthy team working model. And the three things I’ve found to be most important are:</p>
<ul>
<li><strong>Discipline:</strong> Follow a process and stick to it</li>
<li><strong>Focus:</strong> Work with minimal distraction</li>
<li><strong>Patience:</strong> Tackle right thing at the right time</li>
</ul>
<p>None of those things are giving off the fun vibes. I know. But they create structure to avoid the typical pitfalls of design systems. They help avoid reactivity. They reduce the feeling of being overwhelmed. They give people the space to do great work.</p>
<p>And doing great work is pretty damned <em>fun</em>.</p>
<h2>Discipline to follow process</h2>
<p>I don’t know how a functioning design system team works without discipline. There’s simply so many ways to get distracted and too many jingling keys to stare at. If there’s one thing I’ve seen gut a design system team it’s a lack of discipline.</p>
<p>People who work on design systems love to help. It seems to be hard-wired into the personalities that gravitate towards the practice. That’s endearing, but dangerous. This is amplified for teams that feel misunderstood or unappreciated. Because helping is so validating. And the act of helping can satisfy that craving to be appreciated and validated. All at once.</p>
<p>That dynamic can cause a reactivity death spiral. It starts from a design system team’s craving of appreciation and validation. People over-compensate by being hyper responsive to peoples&#8217; needs. Outside teams see that behavior and say, “Oh, <em>that’s</em> what design system teams do”. Expectations are reinforced that feature teams can ask and they shall receive. The team feels even more misunderstood/unappreciated. In response, they over-over-compensate…</p>
<p>Rinse, repeat.</p>
<h3>De-spiraling death spirals</h3>
<p>Ironically, design system teams are especially knee-capped in a reactive environment. So, it&#8217;s essential to have the discipline to avoid those distractions. But that doesn’t come out of thin air.</p>
<p>The way I try to blunt reactivity is with structure. My goal is to create <em>just enough</em> friction to make reacting hard. This structure looks a little different for every team. There isn’t a single formula to follow. Rather, following <em>is the formula</em>. Meaning sticking to the chosen process is what’s most critical. Yes, you’re always improving the process, but incrementally.</p>
<p>For teams I’ve been on, the good mojo comes from sprint planning. I know, boring. But this structure helps keep the team focused on what we’ve committed to work on. Requests are always welcome. But the soonest we commit to is the following sprint. Rare is the time when that is ever a real issue. That structure helps us defer those “quick wins”. And that’s important, because quick wins can be addictive. And in my experience, most “quick wins” are neither quick nor wins.</p>
<p>This means you’ll need to be good at saying, “No”. Ideally, you’re not <em>literally</em> saying “No”, but in essence you are. Yes, this can be awkward and make people sad. It certainly won’t be fun. But discipline requires “No”.</p>
<p>And luckily, there’s a way to make “No” easier…</p>
<h3>Goals put you in a proactive state</h3>
<p>I said earlier that corporate jargon isn’t fun. Things like OKRs, and KPIs are <em>not fun</em>. But damn can they help you approach work proactively. And proactivity makes it <em>much</em> easier to say no.</p>
<p>Nothing makes someone feel less appreciated than having to drop what they’re doing because someone “said so”. Team goals, OKRs, and KPIs can act as a shield against those asks.</p>
<p>That’s why I think it’s so important to rally around team KPIs–with buy in from senior leadership. These KPIs can set the tone for how performance is evaluated. <em>And</em> they immediately give you an out for work that doesn’t fit.</p>
<p>“We’d love to help you, but we’re committed to increasing adoption by X% this half and can’t risk missing that goal.” It’s not <em>you</em> saying no, it’s the agreed upon measure of success that’s saying it.</p>
<p>Design system success metrics could be a series of novels on their own. They’re a can of worms and I have a love/hate relationship with them. But troublesome as they are, they can save a team’s ass when used the wisely.</p>
<h3>Rote through repetition</h3>
<p>So, the team has developed the discipline to follow a process day after day, week after week…</p>
<p>A funny thing begins to happen over time… All that process and structure becomes <em>second nature</em>. Now all of the sudden people aren’t thinking about how to do the work, they’re <em>just doing it</em>. Because it’s become muscle memory. It’s amazing how much friction can be removed through building up healthy muscle memory.</p>
<p>It’s equally amazing how <em>unhealthy muscle memory</em> can invisibly hurt morale. And given that much of it happens without intention, it’s difficult to even notice.</p>
<p>Spending the time on better habits goes a long way.</p>
<h2>Focus to execute (well) on one thing</h2>
<p>Discipline is the gateway drug of focus. A disciplined team should be taking on less unplanned work. Which means it should have more time. That newly-acquired time gives team members the freedom to focus.</p>
<h3>Focus drives quality</h3>
<p>Good work requires focus. This is not breaking news. And in the world of design systems, quality is pretty damned important. I’d go as far to say it’s a requirement. One bug in a highly-used component could create tens of thousands in production. The scale of design systems do not allow the luxury of half-assery.</p>
<h3>You need a focus to focus</h3>
<p>Duh. It&#8217;s basic, but important. Which brings us back to team goals, KPIs and OKRs. It’s surprising how many design system teams don’t have these. Yes, they’re boring (there’s that word again). But they create a shared focus.</p>
<p>That focus will look different for different team members. It may be more granular and atomic for people on the junior side. It may be a strategic area for more senior folks. The more important thing is that everyone has <em>something</em>.</p>
<h3>Ownership at all levels</h3>
<p>What better way to create focus than through ownership? I’m a big believer in creating domains of ownership on the team. Our team overlaps responsibility to avoid single points of failure. But there’s still an official subject-matter expert that drives the team’s thinking. This ownership gives people the freedom and expectation to go deep in their subject area.</p>
<p>And the people who own a subject, <em>own</em> it. They’re trusted to make the final decision. No micromanagement. No hovering. They’ll be supported when it’s helpful, but their hands are firmly on the wheel at all times.</p>
<p>As mentioned, focus/ownership is necessary for quality. But even more importantly, it gets people invested. Invested in the subject matter, in solving the problem, in success. Most importantly, it gets them invested in the team.</p>
<p>And in my experience, personal investment plays a major role in morale.</p>
<h2>Patience to take one step at a time</h2>
<p>And lastly, there’s patience…</p>
<p>Patience was <em>easily</em> the hardest skill for me to learn. My younger self always wanted everything to happen immediately. I wanted team to adopt immediately. I wanted leadership to fund immediately. I wanted results immediately.</p>
<p>It didn’t work–and it made me incredibly unhappy in the process. A great combo.</p>
<h3>You can’t solve every problem</h3>
<p>I still <em>want</em> to make everything happen overnight. The difference is that I know it’s just not possible. All I’ll get in return is burnout and mediocre results. Boring as it may be, I’ve learned the fastest way to get to that better place is by staying focused on one thing at a time.</p>
<p>Ultimately, this can only be solved by…</p>
<h3>Playing the long game</h3>
<p>Design systems just take time. It’s tempting to throw more resources/effort in the hopes to speed things up. Don’t bet on it. It’s not just about how fast a design system team can make a design system. It also requires designers and engineers <em>using it</em>. And that takes (you guessed it) time.</p>
<p>That makes gratification delay incredibly important. I think about progress in years, not quarters–and definitely not months.</p>
<h3>Progress is powerful</h3>
<p>Big bursts of productivity is alluring. But I’ll choose consistent, incremental, progress every day of the week. It’s safer, more predictable and typically leads to higher morale.</p>
<p>The roller coaster of big releases and big hangovers creates a roller coaster of emotions. A steady drip feed of progress creates a steadier team atmosphere. It shows that things are heading in the right direction. Plus, it helps encourage patience. It’s a lot easier to be patient when you’re seeing progress every day. It doesn’t even need to be a lot. But steady, consistent forward progress gives people hope.</p>
<h3>Roadmaps make progress visible</h3>
<p>Incremental progress can be incredibly hard to see. Sometimes it’s so small that it’s impossible to visualize. Roadmaps can help visualize a team’s accomplishment. Your team’s metrics will quantify accomplishment. Those two create a powerful combination.</p>
<p>It’s easy to say, “We’re doing great” or “We’re not doing great”. It’s also a platitude on its own. The value of having a roadmap and team metrics is that <em>you don’t have to say anything</em>. Because they speak for themselves.</p>
<p>But it doesn’t hurt to tell your team they’re doing great. Even if you don’t have it. Just saying.</p>
<h3>No → Not yet</h3>
<p>That fancy roadmap creates even more protection against reactivity. Simply adding someone’s ask onto a long-term roadmap can immediately diffuse tension. It represents that you’re taking their needs seriously and have a plan to address.</p>
<p>It instantly transforms, “No” into “Yes, but later”.</p>
<h2>This is a foundation to build on</h2>
<p>These are the things I focus on to create an environment for healthy morale. I can’t guarantee this alone will improve morale. For myself, it’s laid the groundwork to get there. In a way, it unblocks the ability to do <em>all the other work</em>. You’re still going to have to understand what motivates each person. You still need to invest time and energy into relationships. You still need to do <em>a lot of things</em>. But those things will be easier with a stronger foundation</p>
<h2>None of this matters if you don’t care</h2>
<p>If you’ve read this far, I’m admittedly shocked. I’m also assuming that you are probably disappointed because none of the things I’ve outlined are new. Or novel. Or advanced.</p>
<p>They’re boring. And they’re basic. Sometimes I wonder if that’s why they’re overlooked.</p>
<p>Ironically, many of the processes outlined are used elsewhere to disservice of morale. Creating healthy morale often comes down to caring about it. Because if you care about it, you’re going to put in the work to improve it. You’re going to keep trying things until it gets better. You’re going to come up with better ideas than what’s in this stupid blog post.</p>
<p>But if you don’t care, then none of what I’ve shared will help. Nor will the advice of much smarter people. In retrospect, I should have led with this and saved us all a lot of time.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Own what’s yours]]></title>
            <link>/posts/own-whats-yours</link>
            <guid isPermaLink="false">/posts/own-whats-yours</guid>
            <pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>It’s 2025. Read.cv is shutting down. WordPress is on fire. Twitter has completely melted down. Companies are changing their content policies en masse. Social networks are becoming increasingly icy towards anything outside of their walled garden. Services are using the content you post to feed proprietary LLMs. Government websites appear to be purging data. It’s a wild time.</p>
<p>It’s hard to know where this bottoms out. And those who rely on these services are just along for the ride. Web 2.0 <em>seemed</em> like such a great idea in a more innocent time. We’re at a point where it’s only prudent to view third-parties as guilty until proven innocent. Not as some abstract, principled stance, but for our own direct benefit.</p>
<p>Now, more than ever, it’s critical to own your data. <em>Really</em> own it. Like, on your hard drive and hosted on <em>your</em> website. Ideally on your own server, but one step at a time.</p>
<p>The most common advice I give to junior designers is to <a href="/posts/write-like-you-design/">write</a>. I’m doubling down in the age of AI. Unique ideas and critical thinking are more valuable than ever. The craft of writing looks like it will go the way of cursive based on our current trajectory. People who can uniquely and <em>independently</em> articulate their own ideas have an advantage.</p>
<p>If I’m right, your unique and independent ideas will be increasingly valued. Don’t give that away. Control is ceded the minute it’s published on another service. How much control? Hard to say. It’s at the whims of their EULA, product direction, policy changes, and business health The most reliable way to publish ideas and have them remained published is on a site you control.</p>
<p>Yes, AI companies will almost assuredly scrape your site to feed their LLMs. Whether that will remain legal is questionable. But there’s no question when it&#8217;s willingly posted on their platform.</p>
<p>Is taking control of your content less convenient? Yeah–of course. That’s how we got in this mess to begin with. It can be a downright pain in the ass. But it’s <em>your</em> pain in the ass. And that’s the point.</p>
<p>Plus, people over-think self-publishing. It doesn’t take much. Words–that’s all. An image of two if you’re feeling fancy. But things like search, and all the other fluff associated with modern websites–nah. Less features is a feature.</p>
<p>This isn’t the post to tell you what tools you should or should not use. It doesn’t matter as long as you own what comes from it. It can be something like Obsidian. It can be plain-ol’ HTML and CSS. It doesn’t matter–as much as folks want you to think it does.</p>
<p>And this isn’t just about blogs. This relates to portfolios, code snippets, photos. You name it. What’s made by you should be owned and controlled by you.</p>
<p>Web 2.0 failed. <em>True</em> online sharing died a long time ago. So start taking. Take your ideas, your words, your work–and go home.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Craft and tools and jigs]]></title>
            <link>/posts/crafts-and-tools-and-jigs</link>
            <guid isPermaLink="false">/posts/crafts-and-tools-and-jigs</guid>
            <pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I wish I would have gotten into woodworking when I was younger and had the time to pursue. It’s a practice that I now enjoy vicariously. I watch skilled people make all sorts of interesting things. And through that process, I’ve seen how the craft of woodworking relates to the craft of making software.</p>
<p>The software design practice remains in a self-imposed existential crisis related to craft. So seeing how actual craftspeople do their work seems pretty damned worthwhile.</p>
<h2>Craftspeople are toolmakers</h2>
<p>I learned early on as a crappy DIYer that good craft requires good tools. There are simple limitations to what a human being can do. This does not mean that skill doesn’t matter. The skill comes from how it’s directed through the right tools–“right” being both in function and quality.</p>
<p>There are the off-the-shelf tools, like chisels and planers and all sorts of other things. For software designers, that’ll typically equate to Figma or Sketch. Woodworkers tend to have many single-purpose tools–not to much for software designers. I think that’s a problem, but that’s another topic for another day.</p>
<p>Getting back to the topic–craftspeople are toolmakers. For all the off-the-shelf tools there are, there&#8217;s always that specific thing they can&#8217;t do. Which brings me to <a href="https://en.wikipedia.org/wiki/Jig_(tool)">jigs</a>.</p>
<p>Jigs are the custom tools that craftspeople create to enable them to do great work. In woodworking it’s often used to help make cuts with optimal precision. But, really, it can be used for anything. Jigs are what allow craftspeople to deliver quality predictably and faster.</p>
<p>Jigs are “fine, I’ll make it myself” made manifest. The tool they need doesn’t exist or is too expensive or is too much of a pain in the ass. So a jig is born. The craftsperson has a job to do and they’re not going to let a tool not existing stop them.</p>
<h2>Designers who are not toolmakers are not (effective) craftspeople</h2>
<p>I’m not sure I agree with the above statement, but I agree with it enough to keep it in. Crafting with high quality takes time–no matter the medium. Time is not generously handed out in the software industry. Hand-crafted, from-scratch quality in software is incredibly rare.</p>
<p>And it’s not like other craftspeople enjoy burning time. A master woodworker can almost assuredly create high quality without the use of jigs. But it would take considerably more time and be prone to mistakes (which takes time).</p>
<p>It doesn’t take a genius to connect less collective design time to the steady decline of software experiences. Designers simply have less and less time to focus on craft. So craft suffers.</p>
<p>Do jigs fix this? No. But they help. A designer that can speed up their work through design jigs has a distinct advantage. And every jig that cuts out a step or improves the precision of the output gives time back to focus on craft.</p>
<h2>No, Figma plugins are not jigs</h2>
<p>More specifically third-party plugins. And don’t get me wrong, plugins are great. They’re the closest thing we have to single-purpose tools. But jigs they are not.</p>
<p>While more focused than Figma (I mean, what isn’t nowadays) most are far too broad. Jigs are usually made for one person to do one job. Many plugins–especially popular ones–are made for many people and do many things.</p>
<p>Secondly, and this is just me, but I like things the way I like them. Why would I use a plugin that doesn’t work exactly how I want it to when I can make my own that does? That’s what’s great about jigs. They’re made especially for you because they’re made by you.</p>
<p>Lastly, I don’t trust 99% of them. It’s not immediately obvious what they’re doing or tracking behind the scenes. I have no control over updates or what the tool is going to be tomorrow. Today’s free plugin is tomorrow’s SaaS asking for my email and credit card. Call me cynical, but I’ve been burned too many times to rely on a random plugin.</p>
<h2>Jigs in software design</h2>
<p>So, if community plugins aren’t jigs, then what are? Well, it’s not complicated–it’s the things a designer makes for themselves to make something else. This can take many different forms.</p>
<h3>Local components</h3>
<p>The easiest jig a designer can make is a local Figma component. No, not a library component from their friendly-neighborhood design system. I am talking about a local, custom component for a project-specific need. I am shocked at how infrequently designers use local components. I am also shocked when those designers rail at long it takes to make global changes in their design. Local components are the epitome of design jigs.</p>
<h3>Figma scripts</h3>
<p>The next level up are Figma scripts. I typically use Scripter or, in cases where it works, the developer console. My custom Figma scripts usually follow the pattern of iterating through elements to:</p>
<ul>
<li>Replace all fills in a file from one color with another (no, Figma’s built-in functionality doesn’t work for this)</li>
<li>Layer counting</li>
<li>Remove all hidden layers in a file</li>
<li>Remove layers outside of its parent’s frame bounds</li>
<li>Remove floating point values layer attributes</li>
<li>etc.</li>
</ul>
<p>Notice the pattern here. Many of the examples are focused on cleanup and file hygiene. It’s not directly enhancing the design, but it’s making it cleaner and more precise.</p>
<p>And yes, Figma plugins exist for all these things, but without fail, I’ll need to do something that the plugin doesn’t do. And I’m at the point where I can make these “jigs” faster than I can navigate the Figma community plugin labyrinth.</p>
<h3>Your own Figma plugins</h3>
<p>Every once in a while a jig becomes a repeatedly used resource. At some point it makes sense to commit to making it a tool–or in our case, a plugin. These cases are more rare than we like to believe, so don’t hoard. But in cases where something is useful over, and over, it can be worth making it more permanent as a plugin.</p>
<p>But again, be careful how much time you spend on this. Figma isn’t going to be around forever and so the minute the next “it” design tool comes out, all this work is for naught.</p>
<h3>Single-purpose CLIs</h3>
<p>For any tooling that isn’t Figma-specific, I like to write Node-based scripts that I run in the terminal. If the tool is graphics-based, I output the result as a PNG or SVG. I can then import said output into Figma or whatever tool comes next.</p>
<p>What I like about this is Node and Javascript are not going to depart this world anytime soon. I can rely on these tools working far after Figma goes offline.</p>
<p>And, by all means, don’t limit yourself to only automating design tasks. How much of our day is absorbed by not design? Build jigs for note taking, or improving focus or whatever helps you do your job better.</p>
<h2>Toolmaking is a craft–for the sake of craft</h2>
<p>I’m not a believer in “work hard or work smart”. I think good work takes hard work and smart work. I also think it requires a different line of thinking for designers who want to focus on craft. The outcome alone cannot be the focus. There needs to be as much thought and planning put into how the hell that outcome can actually be produced.</p>
<p>Designers love to create. I encourage them to do just that. Create things that help you create better things. Time is precious. White-knuckling through repetitive, error-prone tasks lead to lower quality. Use all the skills you’ve built up to help enhance the way you work. And if you don’t know how to code yet, here’s a nudge to learn. Unless you enjoy white-knuckling through repetitive, error-prone tasks.</p>
<p>If the design practice wants to elevate craft, it’s going to need a healthy dose of toolmaking.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Consistency means nothing]]></title>
            <link>/posts/consistency-means-nothing</link>
            <guid isPermaLink="false">/posts/consistency-means-nothing</guid>
            <pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Words create a false sense of agreement. My line of work relies on many words loaded with meaning, but lacking concrete definition. Words like quality, craft and simplicity. These are abstract words. And in the abstract, people generally agree on their meaning. But definitions stray wildly once those abstract concepts get specific and real.</p>
<p>This is a problem–a big one. It represents a single instance of a more pervasive issue. where People use the same words to communicate different things. People assume alignment when reality is quite the opposite.</p>
<p>The word consistency is a loaded term in my work. To some it’s a mantra, to others it’s a slur. If you ask five people what consistency is, you’ll get ten different answers. Some people think it means everything looks and works <em>exactly</em> the same way. Others are a little more loosey-goosey in interpretation. These differences matter.</p>
<p>One thing I’ve come to believe in is the power of shared understanding. It seems so obvious, but it&#8217;s shockingly rare in organizations. It&#8217;s impossible to have a meaningful discussion if the words used don&#8217;t line up.</p>
<p>Consistency is a broad term. More specificity is needed to be useful for the context of design. Here’s my imperfect definition of consistency in regards to design:</p>
<blockquote>
<p>The characteristic of following a logical, perceptible, and predictable pattern.</p>
</blockquote>
<p>Those three attributes–logical, perceptible, and predictable–are all important.</p>
<ul>
<li>Logical means that decisions are intentional, rationale and rule-based. And those rules lack contradictions. In short, “2+2” always equals “4”.</li>
<li>Perceptible means that the logic is simple enough to be [discernible]. There are plenty of logical formulas that don&#8217;t seem logical. The logic needs to be clear to the end user, otherwise it&#8217;s worthless.</li>
<li>Predictable means that not only can they notice the logic, but that logic helps them know what to expect. Either consciously or subconsciously, people should be able to “finish the sentence”.</li>
</ul>
<p>This is my definition of consistency and what I use to assess consistency in a design (or lack thereof). Mind you, this alone is severely lacking in detail to be actionable. There’s still plenty of room for interpretation in this definition. This, definition, would need serve as a nucleus for examples and use cases to prove useful.</p>
<p>A definition supported by concrete examples and detail is a great start. But sadly it doesn’t make things easier. Consistency in and of itself isn’t a “thing”. It’s not a binary state. It’s a spectrum. On one side there&#8217;s the complete lack of consistency–disorder. On the other there&#8217;s absolute consistency–homogeny. And then there&#8217;s everything between. Each has its place</p>
<p><img src="https://pjonori.blog/posts/consistency-means-nothing/spectrum.svg" alt="Disorder, homogeny and everything between"></p>
<p>Modern software is a paradox. On one hand it&#8217;s more conformist than ever. On the other hand, most are hilariously inconsistent in execution. The majority of software from large orgs leans towards disorder. This is often due to how large orgs operate. Siloed teams make siloed decisions to support their siloed goals. Most decisions are quite logical in their independent vacuum. But those independent logical decisions end up seeming quite illogical as a whole. It&#8217;s common knowledge what the negative outcomes are. It&#8217;s not a great place to be–except when it is. Sometimes a little surprise can shake things up. A little goes a long way, but it has its place.</p>
<p>Homogeny is typically not possible in a large organization. The sheer number of contributors and the pace of development make that unrealistic. I advise against even trying. I’ve observed attempts that resulted in square-pegging round holes at scale. It’s illogical to force things together that don’t logically fit. Consistency for the sake of consistency isn’t consistency–it’s circular logic. And even if absolute consistency is achieved, it could come at the cost of a boring experience. Monotony can be just as bad as chaos. That said, there are plenty of situations where you want to keep things nice and boring. Like forms.</p>
<p>There’s a time and a place for everything. A little chaos can be helpful to shake things up. On And yes, there are rules that should be inflexible.. But 90% of the time you’re aiming for the messy middle of consistency.</p>
<p>This is what makes this a difficult topic. Each organization’s relationship with consistency is going to be slightly different. Their ideal amount of consistency will vary as well. But establishing that relationship and finding that right amount doesn’t just happen. It requires conversations, debate and (healthy) conflict. Those things don&#8217;t happen without a shared understanding of <em>what the hell consistency really, actually means</em>.</p>
<p>Designers like to design. Developers like to develop. But neither can do their job well without a shared understanding and common language. Words like quality, craft, simplicity and, yes, consistency need definition. And not a dictionary-level definition. They need exhaustive, gory, and unambiguous detail. They&#8217;ll remain contentious and unreachable topics until that happens.</p>
<p>Consistency is essential. But to what degree, and in what situations? That’s up to each organization to decide. But without definition, this mess will persist.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[What I learned from making my own design system]]></title>
            <link>/posts/my-own-design-system</link>
            <guid isPermaLink="false">/posts/my-own-design-system</guid>
            <pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Knowing isn’t understanding. Books are a great way to know. Understanding takes first-hand experience. A person can know that having kids will change their life. They won’t fully understand until they’re living it.</p>
<p>Design system teams are just as vulnerable to the knowing/understanding gap. A team can <em>know</em> how people use it. They can <em>know</em> what’s working and what’s not. But they may not understand due to lack of first-hand experience. The <em>why</em> behind the <em>what</em> is missing. And <em>why</em> is pretty damned important when it comes to design systems.</p>
<p>And this is why I decided to make a design system for my personal websites. It’d been a while since I drank my own kool aid. Which, for the record, I am an ardent drinker of. I wanted to once again be on the consumer side to refresh my first-hand experience. It didn&#8217;t hurt that my websites were a hot mess. And I keep telling people that design systems can fix that kind of thing…</p>
<p>This article isn’t about the design system I made. It’s about what I better understand from going through the process. Below are the things that stood out.</p>
<h2>You can make a design system too late</h2>
<p>I typically warn teams not create a system before it makes sense. Going through this process made it clear how crappy too late can be as well. I’d never been the engineer tasked to inject a design system into a mature codebase. It&#8217;s not fun. Now I <em>understand</em> even more why design system pushes often coincide with redesigns.</p>
<p>Clearly, it’s possible to adopt a design system after it’s “too late”. But it’ll be painful. Lesson learned. There’s an ideal window for injecting a design system. I don’t think that window is uniform, but I’d wager the ramifications are.</p>
<h2>Breaking changes suck</h2>
<p>People know breaking changes suck. But experiencing that suck is something else. Early in the process I made various half-baked components/patterns. Against my better judgement, I implemented them into the websites nonetheless. I then had to refactor every instance once it was clear the components weren&#8217;t ready. Not fun. That kind of work is ancillary and avoidable. Better planning would have avoided find-and-replace hell.</p>
<p>Behind every “oopsie” are people dealing with the fallout. There are two solutions:</p>
<ol>
<li>Make sure the design system cleans up after its own messes. It can be code mods or assisting with refactors. Anything to ease the pain.</li>
<li><em>Don’t make the mess to begin with</em>.</li>
</ol>
<p>There’s a time and a place for messes. Thrash can be healthy in a design system’s youth. But make sure you have a plan to blunt the impact.</p>
<h2>The least amount of technology is the best technology</h2>
<p>I didn’t use React for my design system. I didn’t use Vue, or whatever framework is cool today. I didn’t even use web components. I just used HTML and CSS. And that made this process <em>so much simpler</em>.</p>
<p>There was no installation process. No command line BS. No library dependencies. I wrote CSS, saved the file and viewed the results. There was a straight line from start to destination.</p>
<p>I never focused on framework errors or compatibility issues. We know heaping technology on top technology creates a mess. I <em>knew</em> messes weren’t a good thing, but experiencing reminded me <em>why</em>. Messes are a distraction. My focus had to include how all added technologies worked (and worked together). Sure, they were convenient, but at a cost. I understand the value of frameworks in a large team environment. But this experience further reinforced to keep things as simple as possible. Add with extreme caution.</p>
<p>Design systems aren&#8217;t immune from this. They&#8217;re an abstraction and can represent a detour from the direct line of goal to destination. The people who use your design system just want to get their job done. And your design system is yet another thing they need to keep track of.</p>
<h2>&#8220;Just because&#8221; is a viable excuse</h2>
<p>My websites had numerous instances of similar patterns with <em>slightly different executions</em>. Not out of malice to myself. <em>Just because</em>. I wasn’t thinking ahead. I forgot how I did it in the past. My focus was elsewhere. Maybe all the above.</p>
<p>Designers and engineers think of a design system like a carpenter thinks of a hammer. Which is to say they don’t. They’re thinking about the goal. So when people deviate from a design system, or miss some rule, there’s a 99.9% chance it’s because they were focused on other things&#8230; Like the goal. The more the design system is detached from their goal, the more <em>because</em> happens.</p>
<p>This was reminder that deviation isn’t usually from malice, but <em>just because</em>. The more the design system helps reach the goal, the more people will naturally use (and master) it.</p>
<h2>Not yet doesn&#8217;t mean not ever</h2>
<p>My design process focuses on getting the idea out of my head as quick as possible. I don’t want to spend time polishing a turd. Get things right, <em>then clean up</em>.</p>
<p>If I’m focused on the problem, I’m focused on <em>the problem</em>. Not hunting for components or fiddling with properties. I want the straightest path to the objective. The more the design system wrinkles that path, the less it fits in the process.</p>
<p>There’s three options to address this:</p>
<ol>
<li>Make the design system so natural to use that it becomes the default way to work.</li>
<li>Bake in time to translate rough ideation to use the system.</li>
<li>Both.</li>
</ol>
<p>I’d say the realistic answer is both. Of course it’d be great for a design system to create a flow state. That’s not how everyone works though. Some people prefer to wing it and get ideas out of their head. I am one of those people, so I can relate.</p>
<p>Seeing myself work this way reinforced that it’s OK to not use a design system. Careful pushing when folks use it, as long as it <em>eventually happens</em>.</p>
<h2>Different can be a barrier</h2>
<p>I have years of conditioning to “trust the system”. I still had a knee-jerk dislike of the subtle changes my design system had on my websites. From, <em>my own system</em>. Yes, ironic. I didn’t think the changes were <em>bad</em>. But, I was used to the <em>old thing</em>.</p>
<p>It’s fair for design system consumers to be skeptical of changes. It’s fair for them to be unhappy. Change management is part of the joy of working on a design system.</p>
<p>Be thoughtful of change. Not too much, not too frequent, not too abrupt. Change isn’t inherently good or bad. But either way, it demands others’ time.</p>
<h2>The system made me naturally sweat the details more</h2>
<p>This process exposed how much more investment I’d put into detail when it was in the system. I could shrug off a rough edge if it only showed up once. Not so much if it would be <em>everywhere</em>.</p>
<p>This can be a great forcing function for quality. It’s easier to sell investment in quality when the work will be far reaching. There’s a clearer bang for the buck. Conversely, it stings a little more to knowingly ship crap across the <em>entire product</em>.</p>
<p>This is a strong case for measuring and driving system adoption. Design systems can dramatically improve quality in a fraction of the effort. But it only if it’s used.</p>
<h2>System design is a way of thinking</h2>
<p>The design systems practice is being held back by its focus on artifacts. Tokens and components are an important part of design systems. But they are an output. They are the byproduct of unifying separate, but related patterns in an interface. The thinking behind that output is the real value&mdash;and its applications are endless.</p>
<p>This realization took the shape of my sites’ build scripts. They were unnecessarily disparate. Different build destinations, different naming conventions, some would clear the build directory, others wouldn’t. These variances didn’t lead to better outcomes. They were only a distraction.</p>
<p>I refactored my build scripts to work from a common codebase. All sites follow a standard convention and structure.This wouldn’t traditionally be considered a design system effort. But it required the same thinking and returned the same benefits. If it quacks like a duck&#8230;</p>
<p>This experience cemented my opinion. System designers should expand beyond current definitions of design systems. Find other instances of related-yet-unnecessarily-disconnected things. Connect the dots. Create order from chaos. Reap the same rewards.</p>
<p>There’s a whole world outside our little house we’re cloistered in. We just need to step out the door&#8230;</p>
<h2>Don’t take my word for it</h2>
<p>Now you <em>know</em> what I learned, but the lesson here is to <em>understand for yourself</em>. Get your hands dirty, form your own opinions based on direct experience. Don’t buy what I or anyone else is saying until you’ve lived it yourself. I bet it’ll impact your thinking more than you know.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[AI doesn’t have to be horrible]]></title>
            <link>/posts/ai-doesnt-have-to-be-horrible</link>
            <guid isPermaLink="false">/posts/ai-doesnt-have-to-be-horrible</guid>
            <pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I like Dave Rupert. Never met the guy, but I like him nonetheless. I enjoyed <a href="https://daverupert.com/2024/02/robo-barf/">his thoughts on AI</a> and decided to write my own. I find writing useful to get my head in order. AI isn&#8217;t going away, therefore it&#8217;s only responsible to form a point of view. So unfortunately the world now has another AI blog post. I’m sorry.</p>
<p>I’m skeptical of AI. Less because of the tech and more because of those ushering it into the world. Behind the bluster and marketing-hallucinations is something that could provide value. But, unfortunately, it doesn&#8217;t appear headed in that direction.</p>
<p>I&#8217;ve been noodling with various AI tools off and on for a year now. Most of my experiences have not been what I&#8217;d consider extraordinary. But there are three use cases that I think have real potential.</p>
<h2>Your own brain in a jar</h2>
<p>I’ve been using Google’s NotebookLM for the past few weeks and feeding it all my public content. The results are vacillate between so-so and promising. Nonetheless, I must laud Google&#8217;s execution of AI with this tool. NotebookLM focuses on referencing existing data as opposed to conjuring up slop. I&#8217;ve seen more nuanced and sophisticated responses as the corpus of data increases. It&#8217;s becoming a useful utility to query my past thoughts/musings.  Essential? Not by a long shot, but intriguing.</p>
<p>This could be a valuable utility in the corporate setting to train on team meeting transcripts. A team can rack up dozens of meeting hours a week. Having a team brain-in-a-jar has limitless applications. It can enable quick recall, act as a temporary proxy when people aren’t available to respond&mdash;just to name couple. It also has limitless ethical risks. I’m less enthusiastic of this application given its penchant for abuse.</p>
<p>But, I see potential as a sole user my own information, I see potential here. I plan to continue exploring this avenue.</p>
<h2>Reductive AI could be incredibly helpful</h2>
<p>I have a growing belief that speed is not a problem within tech. Improved tools and processes have made productivity higher than ever. Hell, design systems can generate 20%-40% efficiency gains on their own. I’m starting to wonder if all our progress in efficiency is, in turn, creating inefficiency. Now that things can be output so quickly, we’re struggling to keep track of all that extra stuff.</p>
<p>I don’t think we need technology’s help in making more stuff. Stuff deficit isn’t our problem. The last decade of tech has been a continual slide towards more. More features, more meetings, more messages, more documents. More everything. In my experience, the majority of that stuff is unorganized and/or unnecessary. Generative AI is dousing our existing dumpster fire with napalm.</p>
<p>Instead of using AI to make stuff, we should be using it to get rid of stuff. AI can help pull signal from all our noise. I see three main themes where AI could help here:</p>
<ol>
<li><p>Aggregation: It’s hard to keep track of what everyone is working on. The larger the company, the harder this becomes. AI could improve visibility through aggregating team activity and output. I dream for a way to see what every design team is up to without resorting to hours of Figma-stalking. But it&#8217;s not only a design problem. It&#8217;s universal and acts as a constant impediment.</p>
</li>
<li><p>Organization: One thing I’ve been noodling on is the idea of corporate librarians. This imaginary role would collate company information for logical access. Our current reality of corporate wikis and document collections are a mess. If corportations won&#8217;t librarians, the second best option is to have AI take a crack at it. My hope is a well-trained AI could continually organize, index and prune company data. Maybe then finding that one HR doc wouldn&#8217;t be like embarking on an odyssey.</p>
</li>
<li><p>Extraction: We have so many documents. So many notes. So many transcripts, emails, messages. Imagine simplifying the buffet of artifacts into more digestible tapas—with citations. I worry about hallucinations, but citations should blunt this concern. And any potential to reduce information clutter is worth a bit of risk.</p>
</li>
</ol>
<h2>Outputting average as an advantage</h2>
<p>People write differently. Often very differently. There&#8217;s a slim handful of company employees that know its content/writing guidelines. Even less follow them.</p>
<p>One of the criticisms of AI is that it produces “average”. But average can be good. It&#8217;d be great if all company documents were written the same way. Same typeface, same styling, same indents. Same verbiage, same tone. Same everything. I will never let AI touch my personal writing, but I would understand and welcome it in a team environment.</p>
<p>There&#8217;s tremendous upside to removing the cognitive overhead of learning someone&#8217;s &#8220;written dialect&#8221;. There&#8217;s even greater upside to removing thousands of them.</p>
<h2>None of the above feel generative</h2>
<p>I understand the potential of AI—I’m not that much of a dummy. But the biggest AI hallucination is us thinking it&#8217;s something it isn&#8217;t. I remain stubbornly convinced that we’re steering this tech in the wrong direction. I think there&#8217;s a world where AI could provide true utility without much of the (perceived or real) SkyNet vibes. But those applications are far smaller in ambition and much more boring. So I&#8217;m not holding my breath on my ideas taking off.</p>
<p>We have made a mess of the internet—on many levels. We may have backed into a way to fix it with AI. Ironically, and also unsurprisingly, we’re choosing to double down on more of the same.</p>
<p>I’m hoping for the best and planning for the worst.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Everybody reads]]></title>
            <link>/posts/everybody-reads</link>
            <guid isPermaLink="false">/posts/everybody-reads</guid>
            <pubDate>Mon, 29 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Despite the contrary.]]></description>
            <content:encoded><![CDATA[<p>If you’ve gotten this far, you’re helping prove my point. People read <em>all day, everyday</em>. People read texts and notifications. People read traffic signs and menus. People even read books! Yet “nobody reads” has become accepted as fact in the tech industry. It’s not true. Yet the false narrative has taken on a life of its own.</p>
<p>Yes, reading habits have changed. Attention spans are down. Skimming is pervasive. Everybody reads, but a fewer <em>keep reading</em>. Given the abysmal quality and experience of the average online article, I don’t blame them. People don&#8217;t enjoy unenjoyable things. Is that the sole reason? Doubtful, but we&#8217;re sure not helping ourselves.</p>
<p>Yet, regardless of shorter attention spans exposed to poor reading experiences, people continue to read. Because text is at the heart of interfaces. People need to read a button label to know the action it will perform. Headers are how people orient within apps. I can’t think of a single interface that works without reading.</p>
<p>And if that wasn&#8217;t enough, the growth of remote work means communication is more text-based than ever. Which makes reading more important than ever. Which also makes writing more important than ever. Quality writing in Slack/email is undervalued. Think of how many cumulative hours people spend reading Slack messages. Now multiply that by the size of the company. Imagine a scenario where someone sends an important message to a 200 person channel. Poor writing can simultaneously tank the productivity of those 200 hundred people. The result could be as small as forcing people to re-read the message in order to understand. It could be as big as harmful actions taken due to misunderstanding. Either way, poor writing led to a poor outcome.</p>
<p>But &#8220;nobody reads&#8221; has taken hold. That narrative feeds the following negative feedback loop:</p>
<ol>
<li>“Nobody reads”</li>
<li>Investment in writing decreases</li>
<li>Writing quality diminishes</li>
<li>Less people engage with lower quality writing</li>
<li>Return to step 1</li>
</ol>
<p>As mentioned, the vast majority of people are reading <em>all the time</em>. Just not as much at once. That means writing needs to be <em>better than ever</em>. Writing has to get the point across clearly, interestingly and quickly. More meaning with less words&mdash;which is hard. It takes people with exceptional writing skills to achieve. Yet UX Writers and Content Designers seem to be the last hired and the first let go.</p>
<p>I can’t control how companies invests in writing, but I can control my personal investment. I’m not a great writer. But I am <em>astoundingly</em> better than I was ten years ago. There’s no magic trick behind the improvement, it boils down to respecting the reader.</p>
<p>If you respect the reader, then you’re going to work at getting better at writing. Because you know that someone <em>has to read what you’re writing</em>. And if you respect the reader, you want that to be as enjoyable as possible. At the very least, you want to avoid it being unenjoyable.</p>
<p>If I&#8217;m wriitng a draft for review, I’m proof-reading it first.<sup>1</sup> Yes, a proof-reader is also a reader. They&#8217;re volunteering their time to read my draft. The least I can do is find and fix basic errors not worth their time. I’ve been horrible at this in the past. In retrospect, I could have saved my proof reader hours of editing by spending 10-15 minutes of my own time.</p>
<p>If it’s an internal company message, I am trying to be as clear and succinct as possible. I understand how many messages people need to sift through, so short and sweet is the goal. If I’m writing a message for hundreds of co-workers, that’s a tremendous amount of attention I&#8217;m about to pull. At that scale, even a minor improvement in comprehension can have a big impact. It&#8217;s a major net gain in time if I spend an hour refining a message to save 200 people even one minute of reading.</p>
<p>The importance of in-product writing goes without saying. One poor writing decision can lead to subpar comprehension. The label on a button matters <em>profoundly more</em> than its color or shape. I often spend as much time on the writing in an interface as I do the interface itself.</p>
<p>The better I write, the better the readers’ experience. That could be a friend, a team member or a complete stranger. It could be an idea I’m bouncing off of someone or a feature’s call to action. Words remain the straightest line towards communicating ideas. Ignore them at your own peril. Because as much as we’re told otherwise, everybody reads.</p>
<hr>
<ol>
<li>Yes, there&#8217;s a typo in the sentence covering the importance of proof-reading. No, I&#8217;m not clever enough to have done that on purpose for the sake of irony. Yes, I&#8217;m keeping it because it&#8217;ll no doubt be my zenith in literary achievement.</li>
</ol>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design systems and the never-ending job of buy in]]></title>
            <link>/posts/design-systems-buy-in</link>
            <guid isPermaLink="false">/posts/design-systems-buy-in</guid>
            <pubDate>Thu, 18 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Boy, I'm sure glad we figured this problem out!]]></description>
            <content:encoded><![CDATA[<p>I haven’t talked to a single person working in design systems that wasn’t selling something to someone. It could be convincing leadership for funding. It could be cajoling people to use it. It could be lots of things, but it was always something. Yes, design systems get more scrutiny than other teams. Is that bad? I’ve come to think it’s not.</p>
<p>This post doesn’t have “answers”. If there were answers, there wouldn’t be countless people asking about it. But I do have experience. I’ve been working on design systems long enough to develop a point of view.</p>
<h2>Skepticism is healthy</h2>
<p>Design systems represent massive change to how most software teams work. Of course the design systems team thinks design systems are great. Please excuse those who may have questions before turning everything upside down.</p>
<p>We need more skepticism in this industry. A healthy amount of skepticism keeps us honest. Unfortunately, it disproportionately resides in design systems. The practice will be better for it in the long run. Use that skepticism to improve your skills at influence. That skill will <em>always</em> be valuable.</p>
<h2>Who cares who cares?</h2>
<p>A common complaint I hear from people who work on design systems is that “nobody cares” about the work they do. It’s true, people overlook systems design work when everything is humming along. When something goes wrong, not so much. Design systems are infrastructure. We don’t gaze in awe at a running faucet pouring clean, drinkable water on demand. We should, but we don’t. The same thing goes for design systems.</p>
<p>The best thing I learned about working on design systems was to stop waiting for the medal. Most people aren’t <em>ever</em> going to care. That’s OK. Those people care about all sorts of things I don’t care about. Design systems don’t need people to care, they need people bought in.</p>
<h2>Play the long game</h2>
<p>I was far too impatient early in my time working on design systems. I didn’t respect how much change design systems represented&mdash;and change is hard. I expected the mountain to come to me, which was immature. Getting buy in doesn’t happen overnight. It should’t happen overnight. Getting buy in is a slow, gradual process of gaining trust.</p>
<p>Be prepared for things to take time. “No” will be be a common term. Do your best to translate every “no” to “not yet”. Use each “not yet” as a data point for improving your case.</p>
<p>There&#8217;s almost always something you can do to show progress. It may mean working slower than desired, but some progress is better than none. Focus on what you can do with what you have. Avoid impatience or the delusion of instant acceptance.</p>
<h2>Swim in the same direction&mdash;loudly</h2>
<p>This isn’t rocket science, focus on what the company is focused on. The folks who fund the work are more likely to fund what helps their work. The folks who do the work are more likely to use what helps their work. It’s easier to get people bought in when they see how there&#8217;s a clear connect between your work and theirs.</p>
<p>Aligning to company priorities may mean delaying critical foundational work for the system. This becomes a balancing act. The foundational work needs to happen, but funding makes it more possible. There’s no right answer for this. Find a blend that works best for all parties.</p>
<p>It’s not enough to align priorities though. The work needs to be visible. People need to know that the design system is driving company priorities. And visibility can be really hard. Getting people to see what other teams are doing requires dogged communication. It’ll be a lot of work, but if our experiences match, it&#8217;ll be well worth it.</p>
<h2>People respond to incentives</h2>
<p>Charlie Munger said, &#8220;Show me the incentive, and I will show you the outcome”. People will not use a design system if there’s no incentive to do so. People will definitely not use a design system if there are incentives against it.</p>
<p>Understanding the ecosystem of incentives at your company and tap into them. It could be compensation, performance, convenience, validation, or all of the above. And don’t stop with one! Different people react to different incentives. Build up a diverse portfolio to pull from.</p>
<h2>What’s in it for <em>you</em></h2>
<p>“We” and “us” are a go-to word in the system designer’s lexicon. “Our system will help us all be more effective”. “We’ll have higher quality output in less time”. That makes sense because the focus is on the whole. And it’s all true. It’s a big part of why I work on design systems.</p>
<p>My experience has taught me buy in doesn&#8217;t come from &#8220;we&#8221;. It comes from convincing people how it will benefit them, as in singular. As in, “<em>Your</em> work will be easier.” “The design system will unblock <em>your</em> pet project.” “<em>Your</em> OKRs will go green.” That piques interest.</p>
<h2>Speak the love language(s)</h2>
<p>Different companies want different things from design systems. For some places I worked, they wanted cost reductions. For others, speed of delivery. Others, quality. Don’t sell quality to a team that’s looking for speed. The beauty of design systems is that there’s so much value to be had. Understand what the company wants and hammer that talking point.</p>
<p>The same goes for people. Some find motivation by doing great work. Other people want to climb the ladder. We’re not here to judge, we’re here to get them bought in. Understand the language that resonates with individuals and deliver it.</p>
<h2>Offer no easy exits</h2>
<p>A design system without a mandate is a design system with no leverage. If you create any reason for teams to not use it, there’s a good chance they won&#8217;t.</p>
<p>A common example is framework choice. Let’s say the company uses Angular but the design system team wants to use React. That’s clearly a bad idea because you’re giving teams the ultimate easy-out for not using the system. Teams will not completely refactor their code base to use something no one is requiring them to use.</p>
<p>A more subtle example would be a design system’s Figma library. Designers have an easy-out if the library isn&#8217;t improving output and/or efficiency. People are not going to volunteer to make their work harder. At least not with any regularity.</p>
<p>If the system is not required, the upside needs to be clear and present to everyone. It’s never a bad thing to make a design system desirable to use, but it’s needed without a mandate.</p>
<h2>Make it “everyone’s baby”</h2>
<p>People are more invested in what they’re a part of. Keep an arm’s length from your customers at your own peril. Contributions are an obvious way to make that happen. I’m on record saying that design system contributions are a real mixed bag. But there’s no denying how they can help create personal investment, and thus buy-in.</p>
<p>There are other ways to get people to get people involved beyond contributions. It can be a suggestion on improvement. It can be adding guidelines to documentation. It can be lots of things. The actual thing is less important than its impact on people.</p>
<h2>Sell everything, everywhere, all at once</h2>
<p>A major in design systems requires a minor in sales. If there’s one thing to take away, it’s that fostering buy in is a full time job. A full time job that no one has time for. The answer isn&#8217;t to do two jobs. Instead, find ways to bake selling into the work you&#8217;re <em>actually</em> paid to do.</p>
<p>A design system has many touchpoints. Documentation, design librarys, weekly updates, office hours. All of which can help sell the system. There&#8217;s nothing stopping documentation from making the case for the system&#8217;s value. You can&#8217;t expect people to get it if they aren&#8217;t made aware.</p>
<p>I spent the majority of my time on “selling” at Pinterest. Either in our comms or prioritizing ways to make Gestalt more appealing. &#8220;If you build it they will come&#8221; is a fallacy. People won’t buy what you aren’t selling. Prioritize this work.</p>
<h3>“What is beautiful is usable”</h3>
<p>I believe the substance of design systems is what eventually wins people over. But damn if a little style doesn’t get people’s attention in the short term.</p>
<p>You’re in the game of building trust and credibility. As much as I hate this about people, things that look nice are more trusted. I fought this reality for far too long. Don’t repeat my mistakes.</p>
<p>I primarily focused on substance when I started working on Pinterest&#8217;s design system. I leaned on logic and fundamentals to drive the case for Gestalt. I thought improving fundamentals would be the most effective first step. We focused on documentation writing, infrastructure, and core components. I don’t regret that decision, but it did create an uphill battle because those things didn’t turn heads.</p>
<p>Later on we began adding polish to our docs, our Slack comms, and pretty much every other touchpoint. That’s when visibility and buy in accelerated. Would that have happened without the fundamentals in place? Debatable. But there likely was a better blend of basics and pizazz that could have gotten us further, faster.</p>
<p>Don’t sacrifice substance. But also don’t shy away from sprinkling in “just enough style” to get people’s attention. Spend the time to make your artifacts clear and well crafted. This takes precious time, but it’ll build up credibility and trust. And that’s going to get you buy in.</p>
<h3>Facts matter most</h3>
<p>If style gets people’s attention, substance keeps it. Even with the best marketing and hype train-ing, people will eventually ask for proof.</p>
<p>Proof can be a lot of things. It can be testimonials or case studies, but numbers are my go to. Yes, metrics have flaws. People play plenty of games to make the numbers tell the story they want. But there&#8217;s not a more effective way to make your case than accurate and honest data.</p>
<p>For every sprinkle of style, heap on a big ol’ glob of substance. Which means you need to have measurements in place. Take the time to quantitatively measure the value of your system. Please. And once you have data to share, share it.</p>
<p>A few other bits of advice:</p>
<ol>
<li>Brush up on statistics. It doesn’t need to be PhD-level knowledge. Basic statistical formulas will go a long way.</li>
<li>Fuzzy math is better than no math at all. Things like measuring time savings is incredibly difficult. But my experience has been that something is better than nothing. Share your data, share your methods for measurement, but most of all, share your learnings. It’s better to say, “We’re pretty confident we’re improving efficiency by X-Y%” than “Boy howdy, we have no idea!”</li>
<li>Underestimate, always. Better to underpromise and overdeliver. I like to cut my ROI estimates in half. If the return is still in the black, we have a strong case. I can then go to leadership and say, “Hey, even if we only hit half of our estimates, we’re still making you money.” That gives leadership faith we don&#8217;t need to stick a perfect landing to be worth the time and effort.</li>
</ol>
<h2>“Yes” is great, but not enough</h2>
<p>I’d love to say getting that elusive buy in is where you ride into the sunset and credits role. Unfortunately, buy in on its own can be downright dangerous. A design system team isn’t set up for success if the people around you don’t know what they just bought. That’s a recipe for unmet expectations.</p>
<p>No, the work of getting buy in may not be fun, but buyer’s remorse is much, much less fun. But that’s another topic for another day.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Color is a four letter word]]></title>
            <link>/posts/color-is-a-four-letter-word</link>
            <guid isPermaLink="false">/posts/color-is-a-four-letter-word</guid>
            <pubDate>Thu, 07 Mar 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Profanity can be a remarkable way to get a point across. The trick is sparse use in the right situation. The same goes for color. Yes, color turns heads. Flowers figured that out hundreds of million years ago. That can be good or bad.</p>
<p>Color is both potent and volatile. What’s vibrant to one person may be gray to another. A certain hue can mean good luck in one culture and <em>uh oh</em> in another. What reads as violet on one device looks like navy blue on another. Some people really like green. Others don’t. Why? Because.</p>
<p>Many colors clash. Put red and magenta together and look at it for 30 seconds. I dare you. Sometimes an interface controls every pixel on the screen. But usually not. A beautiful color in isolation can look like garbage placed next to the wrong photo.</p>
<p>A lot about color falls under “it depends”&mdash;which makes it tricky. It’s super effective. Except when not. That a tough foundation to build from.</p>
<h2>An interface is a white wall</h2>
<p>The folks who designed the MoMA knew what they were doing. If you haven&#8217;t been, prepare to see a lot of white walls. Those white walls are a figurative blank canvas to display art. The walls stay out of the way to let the art be art. Interfaces play the same role&mdash;a means to an end.</p>
<p>Think about some of the most-used software today. They’re galleries for content. Content made people who didn&#8217;t design the interface. Imagery, videos, avatars - all likely using a lot of color. Sure, there are situations where an interface needs snatch attention. That&#8217;s typically when I see color show up the most. But, there are more alternatives.</p>
<p>Like words. It turns out <a href="https://pjonori.blog/posts/writing-is-design/">words are <em>great</em> at communication</a>. Start there. Words are a gateway drug to typography. Those two, plus spacing, pacing, proportion, contrast and form do wonders. All without needing to dip into color.</p>
<h2>Gray goes a long way</h2>
<p>An interface that relies on color to work is an interface that doesn&#8217;t work. I advise starting design in grayscale to ensure it works there first. Yes, that limits options, but there are 256 shades of gray to work with. That’s a lot. Most folks (including myself) aren&#8217;t using those 256 options to the fullest.</p>
<p>Every single one of us are guilty of slapping down white or black and moving on. That’s a problem because white and black are hard limits. There’s no up or down to go from there. What happens when an element needs stronger emphasis than black or white? Color is the obvious fallback.</p>
<p>I avoid using black for my default positive value. I pull the shade back to <em>feel</em> like black when set on white but still maintaining separation when paired with pure black. This gives extra room to <strong>go to 11</strong> when needed. Color has a hard floor/ceiling like black and white. There’s no room for <em>11</em> once color intensity is maxed out. I recommend the same approach when using color.</p>
<p><img src="https://pjonori.blog/posts/color-is-a-four-letter-word/intensity-ramp.svg" alt="">
<em>Shocker: Increasing the intensity of a color intensifies its visual prominence. And this can be done in a way that will works in grayscale.</em></p>
<p>Errors come in all sorts of shapes, sizes and severity. Some errors are <em>oh shucks</em>, others are <em>OH SHIT</em>. Color can be a great supplement to distance <em>shucks</em> from <em>SHIT</em>.</p>
<h2>Restraint is key</h2>
<p>My personal style is to remove color whenever possible. I acknowledge that I&#8217;m on the extreme end of the spectrum. No, I do not think this is appropriate for all use cases. But a little color can go a long way. Think <em>better use of less</em> as opposed to <em>more on top of more</em>. That’s a <a href="https://pjonori.blog/posts/systems-math-explosions/#:~:text=Let%E2%80%99s%20take%20the%20%E2%80%9CHello%20world%E2%80%9D%20of%20complexity%20explosions%20for%20design%20systems%E2%80%94color%20palettes.">recipe for trouble</a>.</p>
<p><img src="https://pjonori.blog/posts/color-is-a-four-letter-word/color-combinations.svg" alt="">
<em>Keeping two colors working together isn&#8217;t too tough. Keeping 144 working together is not going to be fun.</em></p>
<p>I&#8217;m partial to <a href="https://pjonori.blog/posts/analysis-of-style/">quantitatively dissecting design</a>. It offers a different lens to put work through to separate <em>the feels</em> from <em>the reals</em>. I like applying budgets to design work. Not as a draconian, freedom-squelching overlord. Rather, something that keeps people aware of decisions to avoid going down a bad road. Sometimes a small nudge towards restraint can avoid big hassles.</p>
<p>I’ve begun to experiment with tools to color budget. These tools would track color usage on a screen and relay it&#8217;s under or over budget. But the devil is in the details. For example, gray-blue is not the same as BLUE-blue. Those two colors should have different &#8220;costs&#8221; in a budget. A lot needs to be figured out, but I&#8217;m intrigued.</p>
<p><img src="https://pjonori.blog/posts/color-is-a-four-letter-word/intensity-vs-area.svg" alt="">
<em>Which square draws more attention? Hint: It&#8217;s not the bigger one.</em></p>
<p>This is something I want to test out on my own work to see how it changes my process, if at all. Things like spellcheck are now a given in writing tools. I want to start trying to use spellcheck-equivalents in my design process. I&#8217;m hopeful this can ensure I&#8217;m being economical in color usage.</p>
<h2>Color is great&mdash;no, really</h2>
<p>It may seem like I have a beef with color. I guess I do to some extent. Not with color itself, but how it&#8217;s used. I think that comes down to underestimating its potency and volatility. By all means, use color. But treat it like using a four letter word in an all-hands meeting. Make it count.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Write like you design]]></title>
            <link>/posts/write-like-you-design</link>
            <guid isPermaLink="false">/posts/write-like-you-design</guid>
            <pubDate>Wed, 28 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Designers tend to be scared of writing. Which is funny because they already]]></description>
            <content:encoded><![CDATA[<p>I’ve been working on a post for the past few days (not this one) and it&#8217;s not going well. I have an idea, but it’s not forming into words. I’ll go to the grave saying writing is one of the most important skills a designer can have. That&#8217;s why I do it so damned much. Writing is a skill that doesn&#8217;t come easy for me. It&#8217;s a struggle. But, hey, what isn&#8217;t?</p>
<p>So, I grind away at this silly article, knowing I’ll figure it out. That was the big shift-<em>knowing</em> that with work, it&#8217;s a matter of when, not if. I know a lot of designers struggle with writing—because designers tell me. I decided to write this entry for two reasons. First, writing is critical-now more than ever. Think about how much time you spend in Slack writing to other people. Writing always was important, now it&#8217;s a deal breaker. Second, it was a good excuse to take a break from the post I’m struggling with. So hey, we&#8217;re both getting something out of this.</p>
<p>Many designers feel more comfortable drawing boxes versus typing letters. Because <em>they spend a lot of time drawing boxes</em>. Many designers also consider writing a different skill. It’s not. Writing is design. Both are a creative act. Both aim to communicate an idea; to lead someone towards a destination. Sure, if you pull out the microscope, there are plenty of differences. But at a healthy distance, those differences become unimportant details. Given both are creative acts, my suggestion is to treat them the same. Use the same style and process you use to design that you use for writing. That’s it.</p>
<p>What process should you use? Your own. You probably/hopefully already have a process that works for you. Apply it to how you write. If you’ve found ways to create something then you’re a long way to creating <em>anything</em>. The trick is to generalize the process(es) you use in design and translate it to writing. I&#8217;ll bet the farm you&#8217;ll find an analog.</p>
<p>What writing style should you use? Your own. If you&#8217;re design with precision and aim for simplicity, write like that. If you’re more casual/playful, do that. There’s a reason you gravitate towards that style-don&#8217;t ignore it. Work with what works.</p>
<p>Am I saying writing will immediately come to you? Were you a kerning machine at age 5? Likely not. There ain&#8217;t no shortcuts - it takes work. This advice won&#8217;t make you a better writer overnight. This should give you the structure to do the work.</p>
<p>There may be folks blowing a gasket that I’m oversampling the writing process. This advice isn&#8217;t intended to make designers into Pulitzer writers. It&#8217;s intended to get designers <em>writing</em>. The best way to get started is to start with something you already know.</p>
<p>A lot of the things espoused as different aren’t that different. I’m strange, but I see more commonality with engineering and design than differences. The same goes for a lot of things, including writing. The common denominator in any creative act is making an idea real. If you’ve already found a process to do that… Do <em>that</em>.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[I’m making a mobile app]]></title>
            <link>/posts/making-a-mobile-app</link>
            <guid isPermaLink="false">/posts/making-a-mobile-app</guid>
            <pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[I’m tired of using apps that I don’t enjoy, so I’ve decided to make my own.]]></description>
            <content:encoded><![CDATA[<p>There are few things more liberating than saying, &#8220;Fine, I&#8217;ll do it myself&#8221;. And then doing it. And that&#8217;s where this whole thing starts&#8230;</p>
<p>I&#8217;m a simple guy. I don&#8217;t like &#8220;stuff&#8221;. Yet, there&#8217;s an abundance of &#8220;stuff&#8221; in today&#8217;s mobile apps. I&#8217;ve come to terms with it as much as possible, but there&#8217;s been one thing I&#8217;ve been unable to get over. Playing music.</p>
<p>I want my music player to play music&mdash;<em>and nothing else</em>. I know I&#8217;m a minority in this view, but I&#8217;m not a fan of audio streaming services. I like to own my music and listen to it. I&#8217;m not into discovery or serendipity. I know what I like and that&#8217;s what I listen to. But today&#8217;s major music apps are more discovery engines that happen to play music rather than music players first. Discovery is <em>hard</em> and requires a completely different experience than media consumption. All of that adds complexity&mdash;which I dislike.</p>
<p>I&#8217;ve looked far and wide for an existing app that would meet my needs and was unable to find anything. If one <em>does</em> exist, well, it&#8217;s too late because I&#8217;ve decided to fix this for myself. Hell, if I can <a href="https://pjonori.design/work/olivia-sans/">make a typeface</a>, I can make a mobile app, right? <em>Right?</em></p>
<p>This blog post will chronicle my process of making my first mobile app, similar to how I <a href="/posts/making-a-typeface/">documented the creation of Olivia Sans</a>. I&#8217;m fairly far along in development, so forgive me as you&#8217;ll be joining midway through the process.</p>
<h2>These are the tenets driving this project</h2>
<h3>A music player should focus on playing music</h3>
<p>This is the north star. This app is a music player and, thus, it will focus on playing music. There will be no favoriting or sharing or any other feature that isn&#8217;t directly tied to the process of playing music. And yes, this can be subjective. For instance, one could say that searching for music is critical to play music as you need to <em>find it</em> to play it. I&#8217;m interested to see how I develop my point of view in regard to what is and what is not directly related to playback.</p>
<p>I don&#8217;t plan to add any functionality for adjusting your library and/or downloading songs. Yes, this means I&#8217;ll be relying on iOS&#8217;s Music app to manage my library. Is this a pain? Maybe, but it keeps the app experience simple and given how infrequently I play with my library, I&#8217;m betting it&#8217;s worth it.</p>
<h3>Playback controls should be persistent</h3>
<p>I am not a fan of how music apps have different control layouts for playback depending on where you are in the app. Typically there&#8217;s a Now Playing view which has large controls and then a minimized view with a subset. I want one playback interface that doesn&#8217;t change so I can rely on muscle memory for interaction and not be concerned with what view I&#8217;m on to do so.</p>
<p>If there&#8217;s one thing I accomplish with this project, I want this to be it.</p>
<h3>A simple mental model is critical for a simple experience</h3>
<p>I want it to be abundantly clear how this app allows you to interact with content. The goal is for this app to have two views: Library and Album. The Library view let&#8217;s you choose your desired album and Album view let&#8217;s you play your desired song. I&#8217;m not a fan of the &#8220;Now Playing&#8221; pattern as it diffuses the <em>Library > Album > Song</em> relationship. I don&#8217;t think I&#8217;ll need more than two views to make this experience work&mdash;and frankly, I think it&#8217;ll be better because of it.</p>
<h3>If there isn&#8217;t room for a feature, it&#8217;s not included</h3>
<p>There will <em>never</em> be an overflow menu in this app. If I can&#8217;t find room for a button/action/whatever, it doesn&#8217;t go in. This will be a lovely forcing function to keep this app simple. I also want to rely on the OS to handle as much as possible. If a user can easily do something outside of this app, I&#8217;d highly prefer to just leave it out.</p>
<p> There won&#8217;t be any settings either. I can see the minimal value in some settings like toggling cross-fading, but it just doesn&#8217;t seem worth it. The closest I would get to settings is the inclusion of a Library view switcher (e.g., Recently played, Albums, Artist, etc.), but I&#8217;m mentally fighting that tooth and nail.</p>
<h3>Don&#8217;t get fancy</h3>
<p>Animated art covers are novel, but ultimately fluff. Ideally one is listening to music <em>without</em> looking at their phone. I&#8217;m not aiming for a radical departure in interface design. Ironically, I believe most music apps have developed sound interface patters&mdash;their primary flaw is that there&#8217;s just <em>too much of it</em>. I aim for polish and attention to detail, but I don&#8217;t see this interface breaking new ground.</p>
<h2>We deserve more purpose-built experiences</h2>
<p>So, this marks day one in my documenting the build of this app. I will be updating this post as I have updates to share. My goal is for this app to solve a very specific problem and nothing more. I also want this project to signify that <em>anyone</em> can do this with enough time and effort. I firmly believe that we&#8217;d all have far better options to choose from.</p>
<h2>Updates</h2>
<h3>January 5, 2024</h3>
<p>I need to start writing before this project is too far along. I&#8217;ve been at this for about a week and a half at this point and I&#8217;m much farther along than expected. I chose to write this app in SwiftUI and while it&#8217;s sped up initial process, it&#8217;s been painful at every step. I forgot how much I don&#8217;t enjoy declarative languages&mdash;it&#8217;s just not how I&#8217;m used to writing code. I can see how SwiftUI can be great once you&#8217;re up to speed, but the learning curve is steep. For every convenience I&#8217;ve be able to utilize, three head-scratchers have halted progress.</p>
<p>That said, I have a semi-working app. The interface is nothing groundbreaking&mdash;it consists of two views, Library and Album.</p>
<p><img src="https://pjonori.blog/posts/making-a-mobile-app/Library.svg#mobile" alt="Wireframe of the Library view"></p>
<p>The Library follows the standard grid layout with persistent playback controls fixed at the bottom. I was hoping to remove album/band name labels, but that only works if you can rely on the album cover being available. I may explore a treatment where album/band is only shown if the cover art isn&#8217;t available. That would make the Library view as reduced as I can imagine.</p>
<p>Tapping into any album shows the Album view.</p>
<p><img src="https://pjonori.blog/posts/making-a-mobile-app/Album.svg#mobile" alt="Wireframe of the Album view"></p>
<p>Again, nothing mindblowing. If anything, it&#8217;s the lack of elements that stand out. There&#8217;s the barest of metadata, no album-level actions and no track level actions. After using this view for a bit, it&#8217;s been refreshing just having <em>less</em> to look at. The playback controls persist on the Album view as well, so playback can be adjusted the same way while navigating through albums.</p>
<p>I&#8217;m not sure what I think about the cover art being as large as I currently have it, given how much it pushes the album tracks down. I might toy with alternative layouts to make the Album view a smidge more utilitarian.</p>
<p>Much of the work in the past view days have been refining the interaction within the playback controls. That little piece of UI is the heart of the app, and so it needs to put in a lot of work. I&#8217;ll go into that area of the app in more detail in a future entry.</p>
<p>Next up is to migrate my views to utilize <a href="https://developer.apple.com/documentation/swiftui/navigationstack/">NavigationStack</a> so that I can more easily implement a nice shortcut to the active album from the playback controls interface. From there, I&#8217;m on to code cleanups and bugfixing to hit my first milestone.</p>
<h3>January 7, 2024</h3>
<p>Progress is speeding up. I continue to not enjoy building in SwiftUI, but I&#8217;m understanding it more. I went through a pretty exhaustive cleanup after accumulating <em>a lot</em> of debt in the initial build. It&#8217;s still a mess, but not a catastrophic mess. I think I&#8217;m about 3-4 days away from being ready for an alpha-ish build&mdash;which means I&#8217;m still a long way away from completion.</p>
<p>I took the leap and removed all album/artist labels in the Library view. That means I&#8217;ll need to create a variant of the album preview component to display album/artist name when the cover art is unavailable. It&#8217;s worth it though as it <em>dramatically</em> simplifies the Library. And yes, I&#8217;ve temporarily blurred the album covers because I&#8217;m not interested in sharing my entire music library.</p>
<video controls width="443" class="mobile">
  <source src="demo-1-7-24.mp4" type="video/mp4" />
</video>

<p>I still need to take on the NavigationStack migration, but the cleanup/refactor should make that considerably easier. After that, I have one more major issue to fix and then the app will be heading to TestFlight. I&#8217;m trying to defer all visual/interactive refinements until I&#8217;m in the TestFlight phase as it&#8217;s far too easy to rathole in pixel peeping instead of ensuring the app actually works. I have a plethora of refinements planned, but I&#8217;m forcing myself to take my own advice and focus on the basics for now.</p>
<h3>January 11, 2024</h3>
<p>All main features are now built. I&#8217;ve also left a trail of codebase destruction in my wake. I&#8217;m nonetheless proud that I have a release build ready after a couple weeks of work. Here&#8217;s some of the functionality I&#8217;ve added since the last post:</p>
<h4>Quick access to the currently playing track</h4>
<p>The currently playing track is now tappable and takes you directly to the album. I&#8217;d like to improve this feature by scrolling directly to the currently playing song.</p>
<video controls width="443" class="mobile">
  <source src="1-11-now-playing-link.mp4" type="video/mp4" />
</video>

<h4>Library sorting</h4>
<p>I added the ability to sort the library by date added and most listens. I didn&#8217;t enjoy adding this feature, but at least it&#8217;s hidden above the library on first load.</p>
<video controls width="443" class="mobile">
  <source src="1-11-sort-drawer.mp4" type="video/mp4" />
</video>

<h4>Pull to refresh</h4>
<p>I don&#8217;t think it&#8217;s reasonable to have to terminate the app to have newly purchased tracks show up in the library. This feature allows you to refresh your available songs/albums, and luckily there&#8217;s no button added on the screen to do it.</p>
<video controls width="443" class="mobile">
  <source src="1-11-pull-to-refresh.mp4" type="video/mp4" />
</video>

<h4>Long press from Library to play album</h4>
<p>This is the one addition that I think I&#8217;ll be using the most. 90% of the time I&#8217;m just opening the app to play an album from the beginning. This quick access interaction is something I&#8217;m already using every day.</p>
<video controls width="443" class="mobile">
  <source src="1-11-long-press.mp4" type="video/mp4" />
</video>

<p>I want to work on refinements, but I know the right thing to do is clean up the mess I&#8217;ve made. I&#8217;ve also begun to share the app out with friends through TestFlight. I was avoiding like the plague, but it&#8217;s clear I&#8217;ll have to add search functionality. Just another task to put on the list.</p>
<h3>January 21, 2024</h3>
<p>My last update was 10 days ago, but that feels like an eternity&#8230;</p>
<p>There&#8217;s been so much progress on the app since the last update. And even more frustration. I&#8217;m glad I took this project on, but it&#8217;s been painful and not in ways that I think I&#8217;ll look back on appreciatively. Developing for iOS is just painful in ways that doesn&#8217;t feel necessary. I&#8217;ll spare you the gory details, but I ran into a couple bugs that were beyond frustrating.</p>
<p>That said, through all the frustration, I have a build ready for public beta. It&#8217;s still missing some key improvements I&#8217;d like to get in, but it&#8217;s ready enough to share with strangers. Here are the latest updates:</p>
<ul>
<li>Added the library search&mdash;only by artist/album name for now</li>
<li>Enabled toggling album/artist labels in the Library (through the Settings app). This was one of those design decisions that I knew would be polarizing, if not downright unusable for some folks. I told myself I wouldn&#8217;t add settings to my app, but I have no problem adding it into iOS&#8217; Settings app.</li>
<li>It&#8217;s not entirely working just yet, but I have the beginnings of functionality to fetch all album artwork that isn&#8217;t available on load. This is an example of Swift libraries being frustrating to work with and having to move mountains to do what <em>seems</em> to be simple.</li>
<li>Numerous accessibility improvements. It&#8217;s not where it needs to be, but it&#8217;s considerably better.</li>
</ul>
<p> So, while imperfect, it&#8217;s time to let this bird out of the nest. The TestFlight build will be made public tomorrow. Speaking of which, the TestFlight experience was pretty awesome. I had consistent support from some good friends who gave me continuous feedback. I also got a huge assist from a friend to fix a bug I wasn&#8217;t able to address. They&#8217;re why I&#8217;ve decided to make this public.</p>
<p>As much as I know the codebase could improve, the stability of the app has been shockingly good. The crash rate is at 0.12% with the last one occurring 2 releases ago. If this public beta gets used with even the slightest amount of volume, I expect that number to go up significantly.</p>
<p>And this public beta is going to be a major influence on what comes next. I&#8217;m admittedly tired and not ready to pour an unlimited number of hours into this app with no realistic goal in sight. In many ways, I&#8217;ve far exceeded my initial goal of building an app that met my needs. The rest is a bonus.</p>
<p>So, if the public beta goes well and there isn&#8217;t some existential flaw with the app, I will be putting it up for sale on the App Store. Which is bonkers and not something that I expected would come of this. Why? Well, damn, why not? I&#8217;ve learned <em>so much</em> from this process already, why not just jump into another learning experience related to App Store submission and marketing. But, I shouldn&#8217;t get ahead of myself. Let&#8217;s see where this public beta goes&#8230;</p>
<h3>January 30, 2024</h3>
<p>Well, it&#8217;s been a ride. The public beta went&#8230; not great. Abysmal would be another way to describe it. My goal is to have 0.1% crash rate to be confident actually putting it on the App Store. The crash rate for the public beta was roughly 25%. I&#8217;m no math wizard, but by my calculations, 25% is significantly higher than 0.1%.</p>
<p>That was the bad news. And, yes, it was pretty bad. I spent a full day trying to decipher crash logs and sending numerous test builds to an overwhelmingly generous individual. No success. Not even progress. I seriously contemplated just hanging up the project given the lack of progress and my complete unwillingness to ship something so busted. I took a few days off and just let it go.</p>
<p>The good(ish) news was that every crash had the same crash report. They all failed in the same place and in the same way. Meaning that if I fixed this one issue, it should fix the <em>only</em> issue folks were running into. I just had to figure out how the hell to do it.</p>
<p>So, after my little break, I got back to work. After some dense reading, I was able to discern that the crash was memory related and it was specifically failing while instantiating album cover art. My personal music library isn&#8217;t small, but it isn&#8217;t gargantuan either. So, on a whim, I decided to not store all the album art on initialization, but rather query/instantiate album covers only when they displayed on the screen. Meaning on the library I would load the image data when the album preview scrolled into view and nil it out when it scrolled out of view. I noticed a significant drop in overall memory usage, especially on initial load. I crossed my fingers, sent a new build to the aforementioned generous individual and waited.</p>
<p>Luckily, the launch crash was no more. Man, that felt <em>so good</em>. I shipped out a new build for TestFlight and while I have no doubt I&#8217;m jinxing myself, there have been no reported crashes to date. This is such a major milestone and I&#8217;m back to being cautiously optimistic. I&#8217;ve spent the last couple days cleaning up some tech debt from bug triage and prepping for the last few pre-launch refinements.</p>
<h3>February 17, 2024</h3>
<p>It&#8217;s been a hot minute since I&#8217;ve posted an update. A ton has happened between now and the previous post&mdash;most notably submitting to the App Store! Here are some highlights of what I&#8217;ve done/learned recently:</p>
<h4>More improvements around memory usage</h4>
<p>Without a doubt, addressing memory usage issues has been the most time-consuming and frustrating part of the entire process. Album art can take up a lot of memory and since SwiftUI handles garbage collection on its own, I don&#8217;t have the ability to manually release memory. So, much of my time has been working towards reducing the baseline memory footprint. We&#8217;re finally at a good place where the app should be able to handle music libraries with many, many albums. I do wish there was a way in SwiftUI to manually clear out memory. Maybe there is and I&#8217;m not aware, but I&#8217;m just glad we&#8217;re in a better place.</p>
<h4>Localization</h4>
<p>While dealing with memory issues was painful, localizing the app was a joy. I was really impressed with how XCode provides a localization table for different languages and an easy API for abstracting strings. I wish there was an equivalent for the web platform, because man was it so easy to implement. I was super, super fortunate to have many generous folks contribute translations for the app. Thanks so all those people, the app is shipping with translations for Simplified Chinese, French, French-Canadian, German, Japanese, Brazilian Portuguese, Russian, Spanish, Latin American Spanish and Ukrainian.</p>
<h4>Improved gradients</h4>
<p>I&#8217;ll be honest with you, vanilla gradients in Swift are not <em>great</em>. I typically use dark mode on my phone, so I didn&#8217;t notice just <em>how bad</em> they were until debugging the app in light mode. I was ready to just ditch light mode altogether&mdash;that&#8217;s how bad I considered it looked. I made a last-ditch effort to improve the gradients by implementing <a href="https://css-tricks.com/easing-linear-gradients/">eased gradients</a> and it made all the difference. It&#8217;s the only reason I&#8217;m shipping with a light mode version of the app.</p>
<p>Yes, it sure would be nice if I had before/after examples of this. Unfortunately I don&#8217;t. Suffice to say, the new gradients have a much smoother spread and the default gradient Swift renders.</p>
<h4>Scroll effects</h4>
<p>If memory usage was the most frustrating part of the development process, implementing scroll logic was definitely second. I cut my teeth on learning scroll logic with the top library controls reveal. That experience provided enough background to help me create scale/blur effect on album scroll.</p>
<video controls width="443" class="mobile">
  <source src="2-17-scroll-effect.mp4" type="video/mp4" />
</video>

<p>There&#8217;s so little to this app that I wanted to have some level of dynamism&mdash;especially in the album view. I&#8217;m frankly not super happy with many of the current motion treatments, I&#8217;m hopeful I can get some help from some peeps in the near future.</p>
<p>While it&#8217;s far from perfect, I have a working build that&#8217;s ready for public usage. If you asked me about a month ago, I would have said it wasn&#8217;t going to get to this point. I&#8217;m equal parts shocked and elated. Hopefully I&#8217;m able to get through the App Store approval process relatively unscathed&#8230;</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[An over-analytical analysis of style]]></title>
            <link>/posts/analysis-of-style</link>
            <guid isPermaLink="false">/posts/analysis-of-style</guid>
            <pubDate>Mon, 18 Dec 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><a href="https://stephango.com/style">Style is consistent constraint</a>. I&#8217;ve never heard a more concise and accurate description. This is a topic near and dear to my heart given I&#8217;ve worked to develop a style in design and photography.</p>
<p>You can find stimulation in strange places. I watched The Batman with comic-book-movie expectations and little anticipation. Then I watched it again. And again. Numerous times. Its style grabbed me. Then I watched the Nolan-era Batman movies to see if it caused the same reaction. Nope. It seemed worthwhile to dig into why.</p>
<p>I dissected the elements of The Batman compared to Nolan’s The Dark Knight to examine each style. With any luck, I’d glean some nugget of insight. </p>
<h2>Silence says something</h2>
<p>The Batman’s dialog is sparse. Conversations are spread out. Lines can often be one or two words. A lot is said without saying anything. The brevity alone developed a mood. The Dark Knight in comparison felt heavier in dialog. It wasn’t <em>bad</em>, but noticeably more of it. </p>
<p>I parsed the subtitles and visualized all lines of dialog in each movie to better understand their differences. The Dark Knight is visualized on the left and The Batman on the right. The diameter of each visualization reflects duration given The Batman is considerably longer (165 minutes versus 138 minutes). Each line in the visualization represents a line of dialog. Its length reflects the line’s number of words.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/dialogs.svg" alt="The subtitles of The Dark Knight and The Batman compared.">
<em>The subtitles of The Dark Knight (left) and The Batman (right) compared.</em></p>
<p>The Dark Knight is much more <em>dense</em> in dialog with far fewer breaks. In contrast, The Batman’s dialog is more spread out with more instances of shorter dialog. </p>
<p>According to <a href="https://www.kaylinpavlik.com/long-winded-actors-and-movies-with-the-most-dialogue/">this analysis</a>, The Batman is considerably lower than the median number of spoken words by any genre listed in that article.</p>
<table>
<thead>
<tr>
<th>Genre</th>
<th>Words per minute</th>
</tr>
</thead>
<tbody><tr>
<td>Comedy</td>
<td>98</td>
</tr>
<tr>
<td><strong>The Dark Knight</strong></td>
<td><strong>95</strong></td>
</tr>
<tr>
<td>Crime</td>
<td>84</td>
</tr>
<tr>
<td>Drama</td>
<td>83</td>
</tr>
<tr>
<td>Biography</td>
<td>79</td>
</tr>
<tr>
<td>Animation</td>
<td>77</td>
</tr>
<tr>
<td>Adventure</td>
<td>76</td>
</tr>
<tr>
<td>Action</td>
<td>71</td>
</tr>
<tr>
<td><strong>The Batman</strong></td>
<td><strong>65</strong></td>
</tr>
<tr>
<td>Horror</td>
<td>63</td>
</tr>
</tbody></table>
<p>The examination confirmed the initial observation&mdash;nearly a third less dialog per minute. The Batman&#8217;s skews towards a noir crime thriller which only accentuates its contrast to The Dark Knight. Less talking gave other elements prominence. The atmosphere played a larger role. I understood how succinct language impacts user interfaces, but this further reinforced the power of brevity.</p>
<h2>A persistent aesthetic</h2>
<p>The look of The Batman has been discussed ad nauseam. Of note is the narrow use of color used throughout The Batman. It’s dark, it’s desaturated save for the occasional bloom of red or orange. The Dark Knight in contrast had a wider spectrum of hues, saturations and brightnesses. Scenes’ color grading varied realistic and stylistic. The colors of The Dark Knight never felt discordant, but more varied.</p>
<p>Below are frames from similar scenes in each movie. First being The Dark Knight, the second The Batman. I observed less color continuity in The Dark Knight compared to The Batman. </p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-shots.jpg#tocontent" alt="Foo">
<em>Scenes from The Dark Knight &copy;Warner Bros.</em></p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-shots.jpg#tocontent" alt="Foo">
<em>Scenes from The Batman &copy;Warner Bros.</em></p>
<p>I attempted to get confirmation by extracting dominant colors of every second from both movies. Each vertical line represents each second’s frame. </p>
<p>The Dark Knight has a diverse spread of hues, saturations and brightness.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-hi.svg" alt="A timeline of The Dark Knight’s dominant color palette, broken down by second.">
<em>A timeline of The Dark Knight’s dominant color palette, broken down by second.</em></p>
<p>Whereas the Batman is far more suppressed&mdash;especially in situation and brightness.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-hi.svg" alt="A timeline of The Batman’s dominant color palette, broken down by second.">
<em>A timeline of The Batman’s dominant color palette, broken down by second.</em></p>
<p>Using the dataset of unique colors taken from a frame every second, I correlated the following color palette ordered by frequency:</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/color-wheels.svg#tocontent" alt="The most prominent colors from The Dark Knight and The Batman, ordered by frequency.">
<em>The most prominent colors from The Dark Knight (left) and The Batman (right), ordered by frequency.</em></p>
<table>
<thead>
<tr>
<th></th>
<th>The Dark Knight</th>
<th>The Batman</th>
</tr>
</thead>
<tbody><tr>
<td>Unique colors</td>
<td>6059</td>
<td>2884</td>
</tr>
<tr>
<td>P10 lightness</td>
<td>5.1%</td>
<td>4.7%</td>
</tr>
<tr>
<td>Median lightness</td>
<td>10.8%</td>
<td>6.9%</td>
</tr>
<tr>
<td>P90 lightness</td>
<td>40.2%</td>
<td>12.0%</td>
</tr>
<tr>
<td>P10 saturation</td>
<td>4.3%</td>
<td>3.7%</td>
</tr>
<tr>
<td>Median saturation</td>
<td>14.9%</td>
<td>10.3%</td>
</tr>
<tr>
<td>P90 saturation</td>
<td>41.2%</td>
<td>26.7%</td>
</tr>
</tbody></table>
<p>There’s a dramatic difference in range of lightness and saturation between the two films which leads to less variance in overall palette. The Batman is dark. For some, <em>too dark</em>. But that stylistic constraint helped create a cohesive visual style. </p>
<p>The wider range of colors in The Dark Knight aren’t distracting, but they didn’t reinforce the atmosphere. Shots of Gotham’s skyline in The Dark Knight could have been a skyline from <em>any</em> city. The constant darkness of The Batman gave its environment a personality of its own. Gotham never broke character. </p>
<p>It’s tempting to inject color in the design of experiences, but this movie is a lesson in the value of <em>less</em>. It&#8217;s surprising just how little is needed.</p>
<h2>Subtraction by addition</h2>
<p>The Batman is known for its use of vintage and intentionally-detuned lenses. Those lenses introduced corner distortion and sharpness falloff which limited the frame’s &#8220;workable&#8221; area to its center. The film also went through the process of transferring digitally-recorded footage to film to introduce grain and overall softness. There&#8217;s a clear difference in acuity, which made The Batman more visually pleasing to me. </p>
<p>The Dark Knight in comparison appears technically flawless. Scenes are sharp with no distortion or aberration. I would have assumed a “cleaner” frame would be less distracting, but I had the opposite response. </p>
<p>Take this scene from The Dark Knight. The frame is technically clean and sharp. Which brings attention to the antennas, building details and Chase sign in the lower-left corner of the frame. Those details don’t add value.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-depth-of-field.png#tocontent" alt="Foo">
<em>Scene from The Dark Knight &copy;Warner Bros.</em></p>
<p>In comparison, almost <em>everything</em> in the frame below is out of focus. Its corners are heavily distorted. Paradoxically, The Batman reads cleaner in composition <em>because</em> of its lack of detail.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-depth-of-field.png#tocontent" alt="Foo">
<em>Scene from The Batman &copy;Warner Bros.</em></p>
<p>In addition to suppressed focus, The Batman frequently shot in rain. The random streaks of rain created visual interference  further softened background detail, which gave the main subject more prominence. </p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-shot-5.png#tocontent" alt="Foo">
<em>Scene from The Batman &copy;Warner Bros.</em></p>
<p>The results from a sharpness detection script confirmed just how much softer The Batman was compared to the The Dark Knight. Each column represents a minute in the film with each dot being a second’s frame sharpness. The sharper the dot, the sharper the overall frame. The Dark Knight shows a strong variation between frame sharpness.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-sharpness.png" alt="A second-by-second analysis of frame sharpness in The Dark Knight.">
<em>A second-by-second analysis of frame sharpness in The Dark Knight.</em></p>
<p>The Batman is significantly softer both in magnitude and consistency from frame to frame.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-sharpness.png" alt="A second-by-second analysis of frame sharpness in The Batman.">
<em>A second-by-second analysis of frame sharpness in The Batman.</em></p>
<table>
<thead>
<tr>
<th></th>
<th>The Dark Knight</th>
<th>The Batman</th>
</tr>
</thead>
<tbody><tr>
<td>P10 sharpness value</td>
<td>1.06</td>
<td>0.34</td>
</tr>
<tr>
<td>Median sharpness value</td>
<td>2.49</td>
<td>0.84</td>
</tr>
<tr>
<td>P90 sharpness value</td>
<td>5.05</td>
<td>2.08</td>
</tr>
</tbody></table>
<p>As an interesting comparison, below are the sharpest frames detected from each movie. The Dark Knight has a large depth of field with seemingly everything in focus.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-cityscape.png#tocontent" alt="Foo">
<em>Scene from The Dark Knight &copy;Warner Bros.</em></p>
<p>Whereas even the sharpest frame in The Batman is considerably softer in comparison. That lack of detail ends up <em>saying more</em>.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-cityscape-2.png#tocontent" alt="Foo">
<em>Scene from The Batman &copy;Warner Bros.</em></p>
<p>I am dogmatically reductive which made this result fascinating. I believed that simplicity relied on removal. I still believe that&mdash;but sometimes the best way to remove is to add. The Batman’s additive process of lens distortion/falloff, film grain and background visual noise removed more significant detail. I’m unsure how I will employ this in my work, but I’m eager to try.</p>
<h2>Less moving, moving parts</h2>
<p>The Batman stood out with how simple the cinematography was. There were less cuts, less camera movement. The viewer was given an unchanging scene to simply take in. It was vindicating to find this quote:</p>
<blockquote>
<p>We had such great sets. We had such great actors. It&#8217;s such a great script. I would ask the question, why do you have to move the camera for no reason? If you’re moving the camera for no good reason, I feel like you’re doing all of your parts a disservice.</p>
<p>&mdash;<cite>Greig Fraser</cite></p>
</blockquote>
<p>After watching The Batman, it felt like The Dark Knight was in constant movement. More cuts, pans, zooms and shake. It was constant stimulus. </p>
<p>I wanted to see just <em>how different</em> the style was. I ran a visual diff from a frames a second apart. I expected a difference, but the magnitude was surprising. </p>
<p>First is the second-to-second frame difference for The Dark Knight. Each column represents one minute of film. Dark purple represents small change, where bright yellow represents high change. The Dark Knight has significant deltas.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-dark-knight-diff-new.svg" alt="Foo">
<em>Visual diff by second in The Dark Knight.</em></p>
<p>The Batman is <em>substantially</em> muted in comparison, with only a single 3 to 4 minute stretch having the similar levels of change.</p>
<p><img src="https://pjonori.blog/posts/analysis-of-style/the-batman-diff-new.svg" alt="Foo">
<em>Visual diff by second in The Batman.</em></p>
<table>
<thead>
<tr>
<th></th>
<th>The Dark Knight</th>
<th>The Batman</th>
</tr>
</thead>
<tbody><tr>
<td>Mean % of pixels changing per second</td>
<td>65.1%</td>
<td>34.9%</td>
</tr>
<tr>
<td>Median % of pixels changing per second</td>
<td>69.4%</td>
<td>28.9%</td>
</tr>
<tr>
<td>P10</td>
<td>29.3%</td>
<td>7.4%</td>
</tr>
<tr>
<td>P90</td>
<td>93.8%</td>
<td>73.6%</td>
</tr>
</tbody></table>
<p>My hypothesis is that the lack of change in The Batman is accentuated by its dark color palette and suppression of detail.  All of these elements converge to create a gestalt stillness. I think this stillness gave room for the viewer to more effectively take in its atmosphere and style.</p>
<h2>Much confirmed, but also some surprise</h2>
<p>Running these two movies through its paces clarified why I enjoyed The Batman’s style so much. The movie was long, but it employed constraint and consistency that amplified its style into something I considered noteworthy. The movie clearly had a vision that was followed from start to end. This isn’t a judgment on the worth of either movie, but I do find The Batman to be better cinematically executed based on consistent constraint. </p>
<p>This exercise wasn’t just a reinforcement of previously held beliefs. The Batman’s use of additives to simplify has weakened  some strongly held beliefs&mdash;especially in regards to my photographic work. To be honest, I wish I would have come to this conclusion roughly nine years ago, but it’s better than never.</p>
<h2>Epilogue</h2>
<p>Designers are addicted to inspiration&mdash;which isn’t a problem if it’s the first step in a larger process. Inspiration alone lacks understanding behind the reaction. Inspiration requires examination.</p>
<p>Developing a point of view on design is essential to fostering one’s own style. The things that inspire you should be broken into a million pieces to see what makes it tick. That lack of understanding keeps you at the mercy of basic mimicry. </p>
<p>This post attempts to provide an example of examination. Both for myself and others. I give designers two main suggestions to help their growth: 1) Dissect others’ work that resonates with you so you can take its elements to make something of your own. 2) Write about your thoughts to fortify your thinking and communication.</p>
<p>Do I think every designer should go through this length with design that catches their eye? Absolutely not. But I do think following an abbreviated process of observation, examination, validation is invaluable for growth. </p>
<p>It would have been easy to say, “The Batman has less dialog and <em>feels</em> simpler.” But, did it <em>actually</em> have less dialog? If so, by how much? It was important to understand if my observations were accurate. How would it help if my point of view was shaped on false pretenses? </p>
<p>I do not think everything can or should be quantified, but I do think it should be examined. While I&#8217;ve spent considerable effort quantifying these two films, this analysis remains an interpretation. And through this interpretation, I have <em>just that much</em> better of an idea of what I consider to be good design. I encourage you to do the same.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Screw it, I’m making a typeface]]></title>
            <link>/posts/making-a-typeface</link>
            <guid isPermaLink="false">/posts/making-a-typeface</guid>
            <pubDate>Fri, 03 Nov 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>This post intends to be a journal of my progress with the creation of my own typeface. It&#8217;ll be updated as updates are available. You can see the typeface in all it&#8217;s glory on <a href="https://pjonori.design/work/olivia-sans/">its specimen page</a>.</em></p>
<h2>Prologue</h2>
<p>I&#8217;ve wanted to design my own typeface for nearly two decades. Now seemed like as good of a time as any. I thought it may be worthwhile to document this process and therefore I&#8217;m going to chronicle my process in this post. With any luck, the final update in this post will be when I&#8217;m &#8220;finished&#8221;. </p>
<p>Why write about this? First and foremost, I want to track what I learn through this process so I can refer back to something if I&#8217;m foolish enough to do this again. Secondly, I thought this post could encourage others to give something like this a try as well. Who knows, I may just end up with something decent&mdash;and if I can do it, <em>anyone can</em>.</p>
<h2>Friday, November 3, 2023</h2>
<p>In order to prep for my foreray into type design, I watched most of <a href="https://www.youtube.com/watch?v=Qy3IGDm-0ac&list=PLRHjTXscef1KOStvmGmo8XryOs7zmCfuK">this series</a> on how to use <a href="https://glyphsapp.com">Glyphs</a> to create a typeface. I viewed close to half of the videos, so I&#8217;d say success is all but guaranteed.</p>
<p>I chose Glyphs as my tool of choice as it appears to be the best of what I&#8217;d say is a mediocre set of options. I spent the first hour or two in a cage fight with the app to understand how to draw paths. It&#8217;s <em>fine</em>, but there was still a considerable learning curve given I cut my teeth on Illustrator and still consider that to be the finest vector drawing tool I&#8217;ve used.  </p>
<p>I&#8217;ve decided to design a sans serif for this project because I&#8217;m not a complete masochist. I&#8217;m unabashedly reverse-engineering existing typefaces to help form my letter forms. The two fonts I&#8217;m using as my reference point are <a href="https://en.wikipedia.org/wiki/Avenir_(typeface">Avenir</a> and <a href="https://en.wikipedia.org/wiki/Helvetica">Helvetica Nueue</a>. Yeah, those are two <em>very different</em> typefaces, but there are distinct stylistic points of interest in each of them. I&#8217;d like to pull what I like about each into my font.</p>
<h2>Saturday, November 4, 2023</h2>
<p>I learned that all good typefaces start with the lowercase n, so that&#8217;s where I started. I don&#8217;t particularly like it. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/n.svg#tocontent" alt="Lowercase n"></p>
<p>I think thicks and thins will need more contrast, but it&#8217;s good enough for the time being. One nice thing about starting with n is that you basically get h for free. The letter m is a little more complicated. I learned that the first hump should be slightly more compressed than the second. I&#8217;m not entirely sure why yet, but I&#8217;m just going to run with it. </p>
<p>I&#8217;m starting to schedule out a letter (or two for each day). I&#8217;m hoping that I&#8217;ll be able to put one or two hours a night into this project after we get our daughters to sleep. </p>
<h2>Sunday, November 5, 2023</h2>
<p>OK, so I devised a plan and that&#8217;s to race towards a full coverage of all glyphs and refine from there. I&#8217;m trying not to dwell on how much work this is going to be&mdash;especially when taking weights and italics into account&#8230; I&#8217;m hopeful that making solid progress in the weeks to come will give me the momentum to keep this going. And speaking of progress, I&#8217;ve landed a first pass on over 40% of the glyphs I&#8217;m planning to design. Some of them are hot garbage, but they exist and that&#8217;s what I&#8217;m going for. </p>
<p>Here&#8217;s a sample of my typeface interspersed with other commonly used sans serif fonts. No, I&#8217;m not going to say which one is mine.</p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/romp.svg#tocontent" alt="Examples of the word romp in various typefaces"></p>
<p>Maybe I&#8217;m delusional, but I don&#8217;t think my font stands out as clearly worse than the comparing fonts. I definitely see things that need to be improved, but all very doable. I&#8217;m also starting to better leverage Glyphs as a tool. It&#8217;s by no means sparking joy, but the grudge-match phase is behind me. I&#8217;m semi-hopeful that I&#8217;ll have a first pass of letter forms complete by the end of the next weekend.</p>
<p>The most interesting tidbit I learned today was that horizontal strokes need to be a smidge thinner than vertical strokes as horzontal strokes appear optically thicker than their counterpart. Note to self: you have a lot of horizontal stroke clean up in your future&#8230;</p>
<h2>Monday, November 6, 2023</h2>
<p>Not many updates for today. However, there are two big takeaways. The first, is that I&#8217;m firmly convinced now that I can do this. I can&#8217;t guarantee that the final outcome will be anything to write home about, but it <em>will get made</em>. </p>
<p>The second is that I&#8217;m quickly coming to the conclusion that I&#8217;ll end up having to make a font testing tool for this project. I&#8217;m learning that Figma takes some coercing to detect a font update and online tools are <em>fine</em>, but nothing to write home about. I&#8217;m looking at the the following resources as a starting point:</p>
<ul>
<li><a href="https://gist.github.com/thundernixon/dda6de7732dfd6dac4a1f801022a7127">Spacing templates</a></li>
<li><a href="http://www.cyreal.org/Font-Testing-Page/">Font testing page</a></li>
<li><a href="https://www.adhesiontext.com/">adhesiontext.com</a></li>
</ul>
<h2>Tuesday, November 7, 2023</h2>
<p>I was able to fit in time to get some simple symbols out of the way. It’s the kind of no-brainer task that can happen after a full day of work that doesn’t take a ton of thinking but keeps progress humming. I&#8217;m well past the 50% mark in terms of glyph coverage. </p>
<p>I don’t think it’s even worth sharing examples given it would just be a smattering of horizontal and/or vertical lines. Lines are easy. Curves are not. I know I have a lot of pain ahead of me with the remaining lowercase letters. </p>
<h2>Thursday, November 9, 2023</h2>
<p>No work gets done when there&#8217;s a sick kiddo in the house. I&#8217;m hopeful that I can make some serious progress with the three day weekend. </p>
<p>That said, I&#8217;ve been chipping away at some of the simpler symbols here and there before I go to bed. Here&#8217;s some of the progress made since Monday.</p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/special-characters.svg#tocontent" alt="Examples of special characters"></p>
<p>The more I noodle on this project, the more I know this is just going to take a lot of time. </p>
<h3>Friday, November 10, 2023</h3>
<p>Today was a big day, so much so that I&#8217;m convinced I&#8217;ll have a full draft character set by the end of the weekend. I have all capital letters in a first draft phase. Capital S was a pain in the ass and will likely need numerous tweaks to get to a better place. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/caps.svg#tocontent" alt="Capital letters in the alphabet"></p>
<p>I was able to spend some general refinements related to stroke angles. I&#8217;m trying to limit the number of angles I use to help with overall visual continuity. So far I&#8217;ve limited myself to the following angles: 17°, 30°, 40°, 49°, 55°, 60°,  69°, 75°, and 83°</p>
<p>That seems like a lot (and maybe it is), but so far each has felt necessary. I&#8217;m going to try to whittle down these angles in the days/weeks to come. There&#8217;s plenty to improve upon, but I&#8217;m still pretty excited with the progress. </p>
<h3>Saturday, November 11, 2023</h3>
<p>Well, I&#8217;m a little more than a little surprised, but I got all my initial characters drawn. The lowercase a and s were major pains and they&#8217;ll need massaging. Nonetheless, I never thought I would get this far this fast.</p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/characters.svg#tocontent" alt="Letters and numbers for the new typeface"></p>
<p>One thing that I put a lot of effort into is to use as few vector points as possible&mdash;for a couple reasons. The first is that is makes curves cleaner in general. This is something I learned a lifetime ago when drawing a lot of icons. The second is that it keeps the font&#8217;s file size down. Less points, means less information. Less information means a smaller file size.</p>
<p>This was a major milestone and I couldn&#8217;t be happier. Next up is building the bold weight for the font!</p>
<h3>Sunday, November 12, 2023</h3>
<p>The sick kiddo got me sick, so I&#8217;m not putting any time into the typeface today. However, I started to broach the creation of a bold weight. What I&#8217;ve learned is that I have <a href="https://en.wikipedia.org/wiki/Ink_trap">ink traps</a> in my future. My lowercase a in particular is in dire need of an ink trap. </p>
<p>One thing that I&#8217;m really happy I did was to design my regular weight to be on the lighter side. I did this because I don&#8217;t use light weights a ton and so I wasn&#8217;t interested in building out versions of every glyph for something I&#8217;d never utilize. I plan to make this font variable and so I&#8217;ll likely up the weight a smidge for body copy&mdash;which is totally A-OK for me. I&#8217;m hopeful this will have cut a ton of time and effort from this project. We&#8217;ll see&#8230;</p>
<h3>Wednesday, November 15, 2023</h3>
<p>Work and sickness have slowed progress down, but major progress has still been made. My big focus has been on spacing. And I&#8217;m not going to lie, I leaned heavily into reverse-engineering the spacing of other fonts to speed up progress. Make no mistake, my final result went through my own translation, but I relied on the logic from other fonts to drive me work. This is a big part of why I knocked this out with relatively little effort.</p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/spacing.svg#tocontent" alt="Example of spacing in the font"></p>
<p>One important note&mdash;while I have spacing in a generally decent space, I have not touched <em>kerning</em>. And I know that&#8217;s just going to be a ball of <em>yuck</em>. An important <em>yuck</em>, mind you, but <em>yuck</em> nonetheless. Knowing myself, I&#8217;ll likely wait as long as possible to do that, so next I&#8217;m on to creating the bold weight.</p>
<h3>Thursday, November 16, 2023</h3>
<p>OK, bolding this font isn&#8217;t a <em>complete</em> cakewalk, but it&#8217;s also not as tough as I initially expected. Glyphs gives you a nice head start with the ability to offset outlines. The big thing to know about font weight management is that you need to keep the same number of points in each weight. Otherwise things break. Luckily, I made two initial design decisions which paid off nicely. The first is that I put a lot of focus in using as few points as possible in each glyph&#8217;s vector form. The second is that I started with a pretty thin (perhaps <em>too</em> thin?) stroke thickness for the regular weight. </p>
<p>This meant that there was plenty of room for each glyph to expand without colliding into itself <em>and</em> less points in the vector path meant less opportunities for points being awkwardly close to each other and creating yucky paths. I have had a few issues pop up in the process so far (ahem, lowercase a&#8230;) but far less than I thought would be the case.</p>
<p>This weight range is <em>plenty</em> for my needs, and so I&#8217;m getting oh-so-close to having Regular and Bold master weights complete. I also toyed with variable font export. And the progress? Well, look for yourself.</p>
<p><video controls width="100%"><source src="./OliviaSans.mp4" type="video/mp4" /></video></p>
<p>On a completely unrelated topic, I once again need to give a tip of the cap to <a href="https://www.remotion.dev/">Remotion</a> which enabled me to programmatically animate the font weight of my typeface and then render as a video. Such an amazingly cool tool that I plan to utilize quite a bit in the near future.</p>
<p>I&#8217;m hopeful I&#8217;ll have weights in a first-draft form by the end of the weekend. I never would have imagined I&#8217;d make this far by this point.</p>
<h3>Friday, November 17, 2023</h3>
<p>No major updates from today, but I do have my first regret which is to not have accounted for <a href="https://en.wikipedia.org/wiki/Ink_trap">ink traps</a> earlier on. I now have a ton of retrofitting of existing glyphs to include ink traps. I&#8217;m hoping like hell that doesn&#8217;t break anything&#8230;</p>
<p>I also have a roster of characters that need to be unhit by the ugly stick. Namely, <em>a</em>, <em>e</em>, <em>m</em>, <em>2</em>, <em>4</em>, <em>7</em>, and <em>&</em>. There are plenty others, but those are the most egregious&mdash;especially the <em>m</em>. </p>
<p>So, this weekend will be all about bolding, ink trapping and un-uglifying some key glyphs. I&#8217;m crossing my fingers that I make decent progress.</p>
<h3>Saturday, November 18, 2023</h3>
<p>Well, I did it. I finished up the bold weight for all glyphs in the typeface. Glyphs made this about as easy as you could expect. The unnerving part of this process was joining all overlapping shapes of each glyph into a single path. That was a point of no return. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/typeface.svg#tocontent" alt="Example of the typeface in regular and bold weights"></p>
<p>The lowercase a was a complete pain in the ass to get working due to the bold weight&#8217;s paths getting modified during the bolding process. Learning how to debug that was a whole process in and of itself. Many, if not most glyphs were easy-breezy though. </p>
<p>In addition to finishing up the first pass of the bold weight, I also un-uglied some of my worst offending designs. Below are below/after/difference screenshots.</p>
<p>Lowercase a had one curve that were way too strong. I chilled that out and while the change is hilariously subtle in the image below, I think it makes a big difference. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/a.png#tocontent" alt="Example of a"></p>
<p>Lowercase m was one of the first letters I made and it shows. The point between the two humps was way too low. That got resolved. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/m.png#tocontent" alt="Example of m"></p>
<p>The number 2 was far too curvy. I made it so that the bottom was more orthogonal. It feels far more stable now. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/2.png#tocontent" alt="Example of 2"></p>
<p>Number 4 was just too narrow. I widened it up a smidge to appear more balanced when paired with other numbers. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/4.png#tocontent" alt="Example of 4"></p>
<p>Number 7’s thins were just too thin. I just reduced the line contrast a bit. </p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/7.png#tocontent" alt="Example of 7"></p>
<p>So, now that those are done, I need to chip away at my new least favorite glyphs, namely &, ?, and 3. I also plan to italicize the weights next. I&#8217;m honestly a little dumbstruck that I have a semi-working typeface in this amount of time. With any luck, I’ll have something really fun to share tomorrow. </p>
<h3>Sunday, November 19, 2023</h3>
<p>Italics: Check. Kind of. </p>
<p>It turns out Glyphs makes it <em>really</em> easy to auto-magically italicize a glyph, but there clearly needs to be some more human TLC put into this. This phase hasn&#8217;t hit the TLC phase, but it&#8217;s nonetheless great to have basic italics added to the font. </p>
<p style='font-size: 2em;'><em>Here&#8217;s an example of italicized text.</em></p>

<p>I&#8217;m able to render out what italicized text looks like directly in this post because I&#8217;m now using the font on this blog. I&#8217;m going to have to alter the design a bit more to optimize for the new typeface. I&#8217;ll get to it.</p>
<p>One thing I&#8217;ve been working on behind the scenes was to build some tools to proof each glyph. There were some existing tools to export proofs as a PDF, but that just didn&#8217;t sit well with me. I wanted something more web-based to proof the typeface given it will primarily be displayed on the web. So, I wrote some build scripts to generate generic HTML that can be styled to proof a typeface. I&#8217;ll share what I have on <a href="https://pjonori.codes">pjonori.codes</a> once it&#8217;s a little cleaner.</p>
<p>Until then, I had the chance to style my proofing HTML into a <a href="https://pjonori.design/work/olivia-sans/">showcase page</a> for the typeface. Given this is my first typeface, I&#8217;ve named it Olivia Sans after our first child. I never had wild aspirations for this project. I simply wanted to make a typeface I liked that would hopefully be something my daughters could use for their own creative projects. As far as I&#8217;m concerned, that&#8217;s success.</p>
<p>And yes, our second daughter is already lobbying for her own font. I&#8217;m hopeful there&#8217;s a Gianna Serif in her future&#8230;</p>
<h3>Monday, November 20, 2023</h3>
<p>Oh man&#8230; Kerning&#8230; This is just going to be a lot of work. I&#8217;m using the <a href="https://glyphsapp.com/learn/kerning">Glyphs&#8217; kerning tutorial</a> as my starting point. My guess is this is going to just be a pain in the ass. I&#8217;m hopeful I&#8217;ll have an update by the end of the week. </p>
<h3>Monday, November 27, 2023</h3>
<p>Thanksgiving and some family issues made updates a little thin since the last post. However, I did put an ample amount of time into kerning. And, it&#8217;s <em>much better</em> than what it previously was. Most of the work was around how a, c, e and o sat next to F, K, k, P and Y. There&#8217;s still plenty to work on, but it&#8217;s less glaringly awful. </p>
<p>Kerning is a trudge at baseline, but the fact that kerning values cannot be automatically be applied to all masters makes it even worse. Luckily, there&#8217;s a script to copy all kerning values to all masters. I used the following script <a href="https://forum.glyphsapp.com/t/is-there-a-way-to-set-kerning-value-for-all-masters-at-once-via-gui/24681/18">graciously shared here</a>:</p>
<pre><code>sourceMaster = Font.masters[0]
targetMasters = [Font.masters[1], Font.masters[2], Font.masters[3]]

sourceKerning = Font.kerning[sourceMaster.id]
for targetMaster in targetMasters:
	targetKerning = sourceKerning.deepMutableCopy()
	Font.kerning[targetMaster.id] = targetKerning
</code></pre>
<p>So, now words like &#8220;walked&#8221; should look much better than <a href="https://twitter.com/_kejk/status/1726593200369123701">they used to</a>. I will continue to chip away at kerning, but it&#8217;ll likely be small, continuous improvements as I see them as opposed to some big Kernapalooza event. </p>
<p>On another note, I&#8217;ve been working to clean up my scripts for generating typeface proofs. My goal is to release the code&mdash;I can&#8217;t guarantee it&#8217;ll be useful, but it worked for me.</p>
<h3>Wednesday, November 29, 2023</h3>
<p>It&#8217;s becoming a game of nanometers now where I&#8217;m making smaller and smaller adjustments to individual glyphs based on how much they annoy me. Lowercase a will likely be in perpetual improvement mode. I look at Helvetica&#8217;s lowercase a and if I can get even infinitesimally close to its form, I&#8217;ll consider it a success. I finally isolated the thing that has been driving me nuts&mdash;the top and bottom of the letterform weren&#8217;t balanced. The top was far too recessed and once I pulled the two closer it immediately looked better.</p>
<p><img src="https://pjonori.blog/posts/making-a-typeface/new-a.png#tocontent" alt="Before and after of lowercase a in regular and bold weights"></p>
<p>I was also able to remove an unnecessary point from the vector path, so not only did I improve upon the form, the font file size is now just a smidge smaller as well!</p>
<h3>Thursday, November 30, 2023</h3>
<p>No typeface updates, but I did end up <a href="https://pjonori.codes/projects/type-specimen/">publishing the generator script</a> I used to make my <a href="https://pjonori.design/work/olivia-sans/">Olivia Sans specimen page</a>. It&#8217;s <em>rough</em>, but it&#8217;s a start. I hope to make improvements as this project progresses.</p>
<h3>Thursday, December 7, 2023</h3>
<p>As you can see, updates are slowing down because progress is slowing down. I&#8217;m officially in the tuning phase. I cleaned up the ampersand, question mark and some <em>really</em> subtle adjustments to the number 3. I also found a stray spacing issue with my lowercase y. All of these are minor, but they&#8217;ll no doubt add up.</p>
<h3>Sunday, December 10, 2023</h3>
<p>One big update and a small one as well. I finally took the time to learn how to <a href="https://glyphsapp.com/learn/creating-a-variable-font">properly export the font</a>. I now have a functional typeface that I can use in my design tools. That&#8217;s been bugging me for some time. While it&#8217;s not a direct improvement to the design of the font, it&#8217;s pretty damned important nonetheless.</p>
<p>The smaller update is that I improved upon the number 2. In all honesty, nearly the whole range of numbers need work, but I&#8217;m glad I have one in a better place. My guess is that I&#8217;ll be making numerous improvements to all numbers in the following weeks.</p>
<h3>Sunday, December 21, 2023</h3>
<p>I made some minor updates to the numeral 3 and uppercase K. Both glyphs were only minimally adjusted to be completely honest. Italics remains a hot mess. That will be the next big focus in the new year.</p>
<h3>Friday, January 12, 2024</h3>
<p>Progress has slowed as you can see, but that&#8217;s because the typeface is meeting my needs for the most part. The italics remain a wart on the overall design, and so I recently cleaned up the uppercase P and the numerals 2, 3, 5, 6, and 9. That addresses <em>most</em> of my discontent, but there&#8217;s obviously ample room for improvement. Here are a couple that come to mind:</p>
<ul>
<li>My ampersand is gross. I wish I had kinder words, but I don&#8217;t. I&#8217;m mulling to take that glyph down to the studs for a full rehaul.</li>
<li>There&#8217;s literally no difference between my uppercase I and lowercase L. That&#8217;s a problem&mdash;this is the kind of thing I chirp about all the time in UI design. What is a typeface if not an interface for language? So, I need to get to that as well. </li>
<li>I&#8217;m still not entirely happy with my lowercase A. The problem is I can&#8217;t yet diagnose what about the letterform is causing that reaction. I&#8217;m hopeful I&#8217;ll get to the source of this and address in the following weeks.</li>
<li>I don&#8217;t like the full vertical bar in the dollar sign. It makes the form too busy, especially at small sizes. I&#8217;ll likely address this sooner or later.</li>
</ul>
<p>So, progress has slowed, but there&#8217;s still <em>plenty to do</em>. I also have hope that I&#8217;ll eventually break ground on a serif font. </p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Systems, math and explosions (in no particular order)]]></title>
            <link>/posts/systems-math-explosions</link>
            <guid isPermaLink="false">/posts/systems-math-explosions</guid>
            <pubDate>Thu, 29 Jun 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Any sufficiently complex system is indistinguishable from chaos<sup id='fnref1'><a href="#fn1">1</a></sup>. Systems are complex at baseline because they&#8217;re not just about collections of things, they&#8217;re <em>also</em> about connections of things. And connections add up fast. Take the following three collections of connected dots.</p>
<p><object type="image/svg+xml" data="exponential-systems.svg"></object></p>
<p>The first collection of three dots has three connections. Obvious. The second collection has nine dots, but now there are 36 connections. The last collection of dots has 27 dots, but the connections have ballooned to 351. This phenomenon is called a <a href="https://en.wikipedia.org/wiki/Combinatorial_explosion">combinatorial explosion</a>. It appears exponential in nature, but for the math nerds, it&#8217;s actually <a href="https://en.wikipedia.org/wiki/Polynomial">polynomial</a>. Honestly, for the sake of this article, it doesn&#8217;t matter.</p>
<h2>Combinatorial explosions are complexity explosions</h2>
<p>Those who work on any kind of system know what combinatorial explosions are even if they haven&#8217;t heard the term. As pieces in a system increase linearly, its connections increase much, much faster. Consequentially, the system’s complexity grows <em>much, much faster</em>. <strong>Spoiler:</strong> That&#8217;s bad. </p>
<p>Let&#8217;s take the &#8220;Hello world&#8221; of complexity explosions for design systems&mdash;color palettes. The best color palette I made for a design system had seven colors. Was it constraining? Absolutely. But it was also manageable from a systems standpoint and <em>highly</em> approachable/understandable for those who used it.  However, most systems have a hundred colors or more. Below is a visualization of all the 2-color combos in 7, 25 and 50 color palettes.</p>
<p><object type="image/svg+xml" data="color-combinations.svg#fullheight"></object></p>
<table>
<thead>
<tr>
<th>Colors</th>
<th>2-color combos</th>
</tr>
</thead>
<tbody><tr>
<td>7</td>
<td>21</td>
</tr>
<tr>
<td>25</td>
<td>300</td>
</tr>
<tr>
<td>50</td>
<td>1,225</td>
</tr>
<tr>
<td>190 <sup id='fnref2'><a href="#fn2">2</a></sup></td>
<td>17,955</td>
</tr>
</tbody></table>
<p>I threw in Material&#8217;s 190 color palette in the table above to show how complex this can get in <em>actual reality</em>. The more complex the combinations become, the more large color palettes become essentially incomprehensible. How many 7-color combinations does a 7 color palette have? One. How many does a 190 color palette have? 1,585,940,245,560.</p>
<h2>Piles of stuff are unpredictable</h2>
<p>A system <em>is a system</em> because its connections work together. As a system grows, it becomes increasingly difficult to understand how everything works&mdash;or if it works at all. This rears its head in general unintelligibility, brittleness and unpredictability. At which point the system has <em>officially</em> devolved into a pile of stuff.</p>
<p>Unpredictability in particular is scary. Because unpredictability, is well, unpredictable. Unpredictable can result in good, <em>bad</em>, or <em>horrible</em>. It can be a combination of the three one minute, then none of the above the next. Which is chaos. And chaos is bad.</p>
<h2>The ways we avoid complexity can also create complexity</h2>
<p>But have no fear! People have honed plenty of tools to stave off complexity. The bad news is that the cure can be worse than the disease. That&#8217;s not to say these tools are inherently bad, but they have limitations which are often summarily ignored. Below are a few:</p>
<h3>Compartmentalization obfuscates complexity</h3>
<p>Compartmentalization is <em>the</em> go to when trying to simplify systems. It’s a great tool to turn one big, monolithic system into a system of smaller, more manageable sub-systems. </p>
<p><object type="image/svg+xml" data="compart-motion.svg#tocontent"></object></p>
<p>Compartmentalization is your basic org chart. The org chart is the quintessential definition of breaking a huge system of things (people) into smaller, more digestible sub-systems (teams). Some may question whether the org chart is a good example given their challenges. That’s the point. </p>
<p>One problem with org charts is they can create artificial barriers between people which make it harder for them to work together. These partitions don&#8217;t <em>really</em> exist in people’s day-to-day work, but are created anyway in the goal of simplification. Teams become siloed, overly focused on their own goals and lose visibility of the greater direction. </p>
<p>That&#8217;s the rub of compartmentalization. It can be difficult to create &#8220;clean cuts&#8221; where all important connections remain intact. This can lead to a disjointed system where elements don&#8217;t feel like they&#8217;re working together&mdash;because they aren&#8217;t. </p>
<h3>Reducing connections moves complexity around</h3>
<p>Just because two pieces in a system <em>can</em> connect, doesn’t mean they should. Explicitly paring down connections between pieces is another clear cut way to reduce complexity.</p>
<p><object type="image/svg+xml" data="removed-connections.svg#tocontent"></object></p>
<p>This can be achieved by restricting component APIs to only accept a subset of options. A system may provide 100 colors, but that doesn&#8217;t mean all of them should be available for every component. This significantly reduces permutations in a system.</p>
<p>On the downside, there&#8217;s added cognitive load to understand which pieces connect, and how. This load increases by how unique each set of options are for each component. Another downside is that rules can get complicated fast. One rule of thumb is to avoid rules with clauses. Once design systems start having rules like, &#8220;Do ____ except when ____ unless ____&#8221; you should just assume someone out there is losing their mind trying to understand or already gave up.</p>
<p>It also begs the question, &#8220;Why have 100 colors in the first place if 90 of them can&#8217;t be used half the time?&#8221; Which is a good question.</p>
<h3>Abstraction creates layers of complexity</h3>
<p>Another approach is to just make a subset of the system available to use. A simple, approachable public system is made available to all&mdash;driven by a bigger, gnarlier private one.  This could also be seen as an extreme level of compartmentalization.</p>
<p><object type="image/svg+xml" data="firewall.svg#tocontent"></object></p>
<p>This approach creates less cognitive load&mdash;especially for beginners. The user benefits from a robust system under the hood, but with far less options to get themselves into trouble.</p>
<p>But of course there are downsides. First off, a public and private system means <em>more systems</em> to deal with. Secondly, abstraction risks long-term confusion as people begin to see that they aren&#8217;t provided all the options. That will beg the questions, &#8220;What are all those other options not available to me?&#8221;, &#8220;Why can&#8217;t I use them?&#8221; and, &#8220;Why does the system get to play by a different set of rules than me?&#8221; Which are all good questions. </p>
<h2>Reduction is the only <em>real</em> way to reduce complexity</h2>
<p>The tools outlined can be effective when well-employed. But math is math. Linearly remove pieces in a system and the connections decrease much, much faster. Treating the symptoms of complexity often just redistributes it. In short, the best way to avoid the pitfalls of complexity is to avoid complexity altogether.</p>
<p>But make no mistake, reduction ain&#8217;t no walk in the park&#8230;</p>
<h2>Stifling order or cataclysmic chaos</h2>
<p>Robin Rendle mentioned that <a href="https://robinrendle.com/essays/systems-mistakes-and-the-sea/">design systems are hyperobjects</a>. For the uninitiated (which included myself until a few weeks ago), hyperobjects are things so big that it&#8217;s beyond human understanding. I don&#8217;t think <em>all</em> systems are hyperobjects, but plenty are. I don&#8217;t think it&#8217;s interesting whether systems can by hyperobjects as much as how <em>quickly</em> they can become one. One second, you&#8217;re fine. The next, chaos.</p>
<p>I don&#8217;t know many people who find chaos appealing. Why then is it so prevalent? Here&#8217;s my theory: we&#8217;re willing to accept the mess because it&#8217;s comfortable. </p>
<p>Avoiding chaos seeks out conflict. Complexity explosions are fueled on &#8220;Yes&#8221; and starved by &#8220;No&#8221;. &#8220;No&#8221; brings dispute. It’s painful, exclusionary, <em>stifling</em>. It won&#8217;t make you the life of the party. And it typically takes incredible discipline to sustain. </p>
<p>Uncomfortable as &#8220;No&#8221; may be, it&#8217;s ultimately the simplest way to keep an explosion from becoming an explosion. </p>
<ul>
<li><span id="fn1"><strong>1:</strong></span> Yes, this is a blantant adaptation of Arthur C. Clarke, but there was no way I would craft a better way to say it. <a href="#fnref1">↩</a></li>
<li><span id="fn2"><strong>2:</strong></span> Total colors from Material&#8217;s color palette. <a href="#fnref2">↩</a></li>
</ul>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Simple things make things simple]]></title>
            <link>/posts/simple-things</link>
            <guid isPermaLink="false">/posts/simple-things</guid>
            <pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I&#8217;m not a complicated guy. The older I get, more I&#8217;m drawn to <em>less</em>. This is best illustrated in a recent project. </p>
<p><img src="https://pjonori.blog/posts/simple-things/dsn.png" alt="Screenshot of designsystems.news">
<em>designsystems.news in all its glory</em></p>
<p>I launched <a href="https://designsystems.news">designsystems.news</a> in April of 2023 as a weekly editorial on design systems. I needed space for more reading and thinking, but knew that wouldn&#8217;t reliably happen without an intentional process in place. I made the site to keep me learning and accountable. But it would fail if it was too much work. </p>
<p>So why write about this? It&#8217;s certainly not for self-aggrandizement as the project isn&#8217;t worthy of it. Rather, the goal is to show what simplicity can yield in concrete terms.</p>
<h2>Simple concept begets simple design begets simple execution</h2>
<p>I had a clear constraint of time and worked backwards from that. Essentially anything that <em>could</em> be removed from the project, was. Its concept, format, structure, aesthetic and implementation all aimed for <em>extreme</em> simplicity. In practice, this meant:</p>
<ul>
<li>The concept behind the site was as straightforward as it gets. It&#8217;s editorial &#8220;news&#8221; about design systems. I got the &#8220;designsystems.news&#8221; domain to avoid the need to describe its purpose. The domain tells you all you need to know.</li>
<li>The format of a weekly links with short-form observations and quotes is, well, simple. It&#8217;s easy to mess up this format with adding imagery, summaries or whatever else. No thanks.  </li>
<li>The site is one page. It has no navigation, no search, no pagination, no categories, no <em>nothing else</em>. The layout is so simple it doesn&#8217;t require CSS breakpoints to be responsive.</li>
<li>The design of the site has three colors, no custom fonts, no sophisticate type ramps, no visuals. It&#8217;s admittedly <em>austere</em>.</li>
<li>The site is one request coming in at ~10 KB (as of May 2023). There&#8217;s no JavaScript. The (little) CSS used is added to the head and the header SVG is inlined. Any device on any connection can effortlessly access this site. Entries are compiled from (simple) Markdown meaning it unfortunately required a build script. I begrudgingly have three NPM dependencies, which ideally would be zero.</li>
<li>All of the above has enabled a simple relationship with the reader. There&#8217;s no tracking, no cookies, no upsell, no &#8220;Sign up for my newsletter&#8221;, no &#8220;Follow me some godforsaken social network&#8221;. No strings. Just come and read.</li>
</ul>
<p>Truth be told, it could be simpler. Perhaps one day it will.</p>
<h2>Shipping nearly nothing turns out to be simple</h2>
<p>Removing <em>so much</em> resulted in removing many problems typically faced when making a website. One page meant no information architecture or navigation schemes. No JavaScript meant no complicated toolchains or build scripts. Minimal NPM dependencies meant minimal maintenance. No images or fonts meant no optimization, performance-tuning or FOUT. No tracking, upsells or hidden agendas meant no GDPR compliance, marketing or general nonsense getting in the way of the content.</p>
<p>All that simplicity enabled the entire project to go from idea to deployed in <em>roughly 5 hours</em> (including 2 hours of muddling through regular expressions). Posting updates takes minutes. Reading articles is far and away the largest time commitment&mdash;as it should be.</p>
<h2>Honest and clean</h2>
<p>I don&#8217;t have much free time. Any time commitment nowadays has to be worth it. Nowadays, &#8220;worth it&#8221; often equates to money. That dynamic plays a large part in the modern web&#8217;s proclivity for bait-and-switches, &#8220;Please like/follow/subscribe&#8221;, hidden sponsorships and the ever-present invisible eye that&#8217;s collecting your personal information. I simply wasn&#8217;t going to do that. But, I had to make this site in a way where <em>that was actually feasible</em>. </p>
<p>A project that took months of time to create and required constant high-maintenance would require something substantial in return. I have no need for a return because I&#8217;ve reduced the investment to all but nothing. With essentially no overhead or maintenance, this site isn&#8217;t costing me anything. And no cost means no need to extract value.</p>
<p>I now have a site that&#8217;s encouraging me think about design system ideas. The reader gets content in return. In short, this site was designed to be clean-burning to ensure a clean relationship with its readers.</p>
<h2>Parting words</h2>
<p>Simple isn&#8217;t always fun. It&#8217;s often not inspirational. It&#8217;s <em>typically</em> not convenient. It&#8217;s not easy. But simple <em>is</em> simple. And boy is simple a breath of fresh air in today&#8217;s world. That&#8217;s why I&#8217;m so proud of of this project. It&#8217;s not beautiful to look at. It&#8217;s not a technical marvel. It isn&#8217;t solving some grand problem. It&#8217;s just a single page on the internet. </p>
<p>I&#8217;m most satisfied by what this project <em>isn&#8217;t</em>. There&#8217;s not much to it, and that&#8217;s the point. Practically speaking, it <em>had</em> to be made this way due to life&#8217;s constraints. Simple is a word so trodden over that it&#8217;s lost its meaning. Real simplicity is often unnoticed <em>by design</em>. But overlooked as it may be, incredible things can come from it. Working on this project has reaffirmed just how much can happen when you do as little as possible.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Measuring design system “adoption”]]></title>
            <link>/posts/design-system-adoption</link>
            <guid isPermaLink="false">/posts/design-system-adoption</guid>
            <pubDate>Thu, 18 May 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Measuring design system adoption is like measuring how much you love your children. It&#8217;s hand wavy, adjective-laced and head-scratching ensues once the numbers come out. However, developing an adoption metric is attainable, productive and won&#8217;t land you in family therapy. As long as your &#8220;adoption&#8221; metric isn&#8217;t measuring adoption.</p>
<h2>Measuring true adoption is impossible</h2>
<p>Design system adoption isn’t quantifiably measurable because adoption isn&#8217;t purely quantitative. It&#8217;s also one of those things I suspect we all <em>think</em> we agree in definition, but there&#8217;d be some wild disagreements once we got into brass tacks. My take is adoption that just measures amount of use is missing the amount it&#8217;s used <em>correctly</em>. And it’s that last part that&#8217;s the monkey wrench. Once <em>intended use</em> is in the picture, well, now you’re crossing quantitative and qualitative streams.</p>
<p>So, if you buy what I&#8217;m selling, true adoption measure isn&#8217;t attainable. Congratulations! You now have the freedom to define something less <em>loaded</em> than adoption while still providing useful signal.</p>
<h2>Measure aspiration instead of adoption</h2>
<p>Now is a good time to stop reading and think about what wild, unmitigated success looks like for your design system. What part of that wild, unmitigated success is: </p>
<ol>
<li>Quantifiable</li>
<li>Simple to understand</li>
<li>The most critical marker of success</li>
</ol>
<p>That&#8217;s your &#8220;adoption&#8221; measure. </p>
<p>As an example, if success looks like enabling teams to quickly develop new components on top of your system, perhaps you measure the use of your tokens/building block components in non-system components. I&#8217;m spit-balling here, you&#8217;ll come up with something better.</p>
<h2>An approachable measure helps reinforce your vision of success</h2>
<p>Simple is hard. We all know that. But an approachable metric is critical. I&#8217;d argue the <em>way you measure success</em> can be just as powerful of a narrative as the measure itself. How do you measure your view of success that&#8217;s approachable? I can tell you it&#8217;s not with <em>more math</em>. And that&#8217;s the beauty of <em>not</em> measuring adoption&#8211;you get to choose your own adventure. </p>
<p>For my work on <a href="https://gestalt.pinterest.systems/">Gestalt</a>, success has always been moving usage from the small, atomic components to the bigger, more opinionated ones. Thus, the measure I&#8217;m proposing is to divide our bigger, opinionated components by <em>everything else</em>. Meaning our own smaller components count against us. The rationale goes back to the fact that while our smaller components are critical, their usage does not equate to <em>wild, unmitigated success</em>. There&#8217;s even signal that those smaller components impede on the usage of bigger ones. Is that an accurate measure of adoption? Nope. May it even be a little controversial? Sure. But it was the clearest measure I could think of that communicates success.</p>
<h2>Metrics are a hell of a drug</h2>
<p>I love numbers. In moderation.</p>
<p>In my experience, metrics can be a gateway drug to <em>more metrics</em>. Without discipline, you end with metrics for the sake of metrics. Then one day you wake up in a pool of spreadsheets and aren&#8217;t quite sure how you got there. </p>
<p>Metrics can be fudged, manipulated and stomped on. Worst of all, metrics can abstract what you’re actually trying to accomplish. Without a thinly veiled skepticism of metrics, you can fall trap to believing that moving the metric <em>is</em> the job. It&#8217;s not. And even despite best efforts, once this measure becomes a KPI or shows up in OKRs, some people will be solely focused on it. </p>
<p>Let’s be clear, you’ve hit wild, unmitigated success when when you’ve hit wild, unmitigated success. Metrics can help validate and contextualize, but chances are, you&#8217;ll already know when you&#8217;ve done it.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Tend your garden]]></title>
            <link>/posts/tend-your-garden</link>
            <guid isPermaLink="false">/posts/tend-your-garden</guid>
            <pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Stop being too busy to stop being too busy]]></description>
            <content:encoded><![CDATA[<p>“I’m too busy to do what it takes to stop being too busy.”</p>
<p>I’ve seen this work dynamic a thousand times over. Workplaces focus on completing the next task as quickly as possible&#8211;with little regard for its aftermath. Corners are cut, messes are made and then its on to the next, next task. After enough time, general disorder sets in. It often takes the form of: </p>
<ul>
<li>&#8220;Where did I put that file?&#8221;</li>
<li>&#8220;Is this the <em>final</em> version?&#8221;</li>
<li>&#8220;How do I get this to work again?&#8221;</li>
<li>&#8220;Who can I ask to understand this?&#8221;</li>
</ul>
<p>Disorder creates micro-inefficiencies which make easy tasks difficult. Less is achieved with greater effort. And there&#8217;s even less time to do what it takes to stop being too busy. The cycle only exaggerates over time. That, friends, is a doom loop.</p>
<p>What&#8217;s worse? Multiply this by the number of coworkers also struggling with disorder. Even if only one team member working in disorder, it&#8217;s likely affecting others. Given most teams work in shared spaces (e.g., Figma, Google Workspace, etc.), our personal mess is <em>everyone’s</em> mess. </p>
<p>Working in constant disorder has little upside. It slows you down. It&#8217;s stressful. It distracts from more important work. Worst of all, the longer it goes on, the more work it takes to fix.</p>
<p>The work needs to be done, but not at the cost of constant diminishing returns. Quantifying inefficiency can be challenging and every company will have its own threshold of tolerance. But at some point, focusing on improving one’s own efficiency is of greater value than continuing forward at an impeded pace. Let&#8217;s not forget the important issue of mental health. Burnout is figuratively and literally killing people. Addressing disorder is an opportunity to help employees&#8217; wellbeing and the company&#8217;s bottom line.</p>
<p>Ideally, companies would allocate time in projects to address these issues. In my view this is the straightest path towards stunting systemic disorder. However, I haven&#8217;t regularly seen that be the case, so let&#8217;s discuss Plan B: Personally carving out time to create order. Let&#8217;s call it garden tending.</p>
<p>So, what should this look like? It&#8217;s going to vary by individual, but I can tell you how I&#8217;ve started. I’ve begun by investing an hour every Friday to take on basic orderly tasks. Namely:</p>
<ul>
<li>Closing all browser tabs</li>
<li>Cleaning out my email inbox</li>
<li>Closing up all open conversations</li>
<li>Making sure my calendar for the following week is up to date</li>
</ul>
<p>That&#8217;s helped, only prevented things from getting worse. My goal is to be in a much better place. I plan to invest an additional full day per month to focus on deeper improvements. Specifically:</p>
<ul>
<li>Organizing files on cloud services</li>
<li>Cleaning up and generally improving shared documents</li>
<li>Archiving or deleting unused documents previously shared with others</li>
<li>Organizing local files on my hard drive</li>
<li>Leaving non-critical Slack channels </li>
<li>Cleaning/organization of my personal doc used for notes and information archiving</li>
<li>Physically cleaning my work station</li>
</ul>
<p>I plan to prioritize improvements that affect other people (such as shared docs and cloud files). My thinking is creating order for the most amount of people will be the most effective use of time. I aim to learn investment in creating order impacts long-term personal effectiveness. I’m confident the rate of return will significantly net positive, but I won&#8217;t know until I try. </p>
<p>Doing &#8220;the work&#8221; is why we get paid. But doing the work so you can <em>do the work</em> is just as important. This kind work doesn&#8217;t need to be chaos. There are many aspects to a stressful work dynamic that is not a personal choice. But the order we create for ourselves is. Do what it takes to stop being too busy. Tend your own garden. Everyone benefits in the end.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[The English language&mdash;A guideline for how not to make a design system]]></title>
            <link>/posts/design-systems-english-language</link>
            <guid isPermaLink="false">/posts/design-systems-english-language</guid>
            <pubDate>Wed, 27 May 2020 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>This post was initially published on the <a href="https://pinterest.design/the-english-language-a-guideline-for-how-not-to-make-a-design-system-b988be81aa53">Pinterest Design blog</a>.</em></p>
<p>One of the major challenges of systems design is communicating the rationale of decisions — why you landed on certain choices, and why they make sense in the bigger picture. I’ve found language is an effective metaphor to explain my rationale: Creating a system is, in essence, creating a language.</p>
<p>Let’s look at the definition of the word “language”: The method of human communication, either spoken or written, consisting of the use of words in a structured and conventional way.</p>
<p>We can tweak that a bit to apply to design systems: The method of human communication within a user interface, consisting of interface elements in a structured and conventional way.</p>
<p>I’ve found the rules of language to be a great way to vet my own ideas…and to critique other people’s work, too. Using language metaphors to describe system tenets keeps things tangible. Language is as common a denominator as there is — the translation (no pun intended) is straightforward.</p>
<p>What’s less straightforward, however, is the English language. From first-hand experience, I know English’s rules are not fun to learn. It’s riddled with inconsistencies and irrational rules. It’s also a gold mine if you’re looking for examples on how to not design a system. Here are some ways that language can translate to and help explain your system’s design.</p>
<h2>Doppelgänger depot</h2>
<p>The words doppelgänger and depot are adopted into the English language. Doppelgänger originates from German and depot from French. By adopting these words, we’ve also adopted the rules for how those words are constructed. Now all of a sudden we have umlauts and silent t’s in our language that we need to make sense of. There’s nothing wrong with this (who doesn’t love an umlaut?), but they don’t fit the foundational rules of English. The result is they don’t feel as though they’re a natural part of the language.</p>
<p>The common equivalent in systems is the classic, “Design System ABC did XYZ — we should just do what they do!”</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/material.png#tocontent" alt="Material's color palette">
<em>Material’s color system is no doubt impressive, but that doesn’t necessarily mean it’s compatible with yours.</em></p>
<p>Everything in a design system should originate from its fundamental rules. Pulling ideas from other systems is expected, but those ideas need translation to conform to your system’s underlying thinking. So it might have made more sense for Doppelgänger to become Doppleganer in English and for Depot to become Deepoe (or Deepow? or Deapoh?). Just sayin’.</p>
<h2>Flammable? Inflammable? Whatever, you choose!</h2>
<p>Flammable and inflammable mean the exact same thing — just look it up. But then…why do both exist? Should I use one over the other in certain contexts? Do people even know they mean the same thing? I have so many questions! Couldn’t we have settled on one word and moved on?</p>
<p>The go-to example of this principle in design systems is the checkbox and switch. Systems often provide both these solutions to address the same need. This makes you ask: When do I use one over the other?</p>
<p>There are good reasons to have both a checkbox and a switch. For instance, you use a switch in the mobile context and a checkbox in the web context. In that case, you’re providing a single solution (per platform) to solve a single need.</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/checkbox-switch.png#tocontent" alt="Checkbox and switch">
<em>Our design system at Pinterest system has supported both checkboxes and switches on the web platform which led to unnecessary variance in usage. We’re working to consolidate to one single treatment.</em></p>
<p>When people have many options to do the same thing, they’ll usually end up using every option. That almost always leads to poor outcomes, and the design system’s job isn’t to provide a buffet of options, but to provide the solution for specific use cases.</p>
<p>Design systems, just pick “flammable” (or “inflammable”) and move on.</p>
<h2>There, their, they’re</h2>
<p>Come on…you knew this example was coming.</p>
<p>English is full of nearly identical homonyms and they cause constant confusion. It sure would be nice if English had distinct words for distinct concepts.</p>
<p>A common example of breaking this rule is link treatment. Due to accessibility, color alone isn’t enough to signify a link. There should be a clear and distinctive way to tell the user, “Hey, this text here is a link.”</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/bold-links.png#tocontent" alt="Bold links">
<em>Another example using Pinterest’s design principles. We could improve upon this.</em></p>
<p>Distinct interface elements should have something which makes it distinct. Elements that look the same but are different in purpose will always cause confusion. It’s simple: If things are different, they should look, sound and feel different. Don’t go their (sorry…there).</p>
<h2>Exceptions of acceptions</h2>
<p>Accept (əkˈsept) and except (ikˈsept) have technically different pronunciations. But let’s be honest, they sound the same. Unfortunately, they mean drastically different things: “It was excepted” means something very different from, “It was accepted.” Given how diametrically opposed those two words are, it’s safe to say the words should be more clearly differentiated.</p>
<p>A similar example in design? Using color as the only differentiator between statuses like success and error. Given how fundamentally different these are, there should be a strong distinction between the two. Color is one way, but it should go well beyond just that. For maximum accessibility, we should differentiate error messages through messaging and iconography as well as color.</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/toast-color-blindness.png#tocontent" alt="Pinterest Toasts with color blindness">
<em>Well, we got 1 out of 3 differentiators here. Sure, the text is different, but there aren’t any distinguishing features in how the text is constructed with our error toast’s text (something like Oops! at the beginning) to differentiate it at a glance.</em></p>
<h2>Logophobia, phobophobia, panophobia</h2>
<p>You don’t need to be a rocket scientist to know the three words above are related. The phobia suffix makes these three words immediately relatable: They share a commonality, yet represent distinct concepts.</p>
<p>Families of design components should have shared traits that make it clear they’re related. This often happens naturally, but it’s important to be intentional about what those traits are. Doing so will help you make system-friendly decisions when you add to the family.</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/inputs-button.png#tocontent" alt="Comparison of Gestalt inputs and buttons.">
<em>Pinterest’s form inputs share a set of visual traits (corner radius, border treatment, sizing, etc.), but each also has a distinct trait that makes it unique. The shared visual traits also act as a contrast from other components, such as our buttons.</em></p>
<p>Elements that are a part of a family should intuitively and consistently feel that way. The more intentional you are on how related components are visually communicated, the easier it’ll be to add your next phobia.</p>
<h2>Supercalifragilisticexpialidocious</h2>
<p>Avoid being fancy when you can use a simple word — say “good” rather than “transplendent” so people stay on your page. The same goes for design: Don’t complicate basic concepts. You’re only going to make it harder for people to understand how to use the system.</p>
<p>This was one of Pinterest’s guiding principles for our initial dark mode rollout. We were set on keeping things simple and not overthinking. So our dark mode was in essence a palette flip with a super minor tweak to one of our grays for accessibility. And it worked (For the most part, I’ll get into that later.) It also allowed us to ship extremely quickly with minimal overhead.</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/dark-mode.png#tocontent" alt="Comparison of light and dark mode on Pinterest.">
<em>We kept our dark mode simple and it paid off.</em></p>
<h2>I before E except after C…except when not</h2>
<p>Anyone that’s had to learn English is familiar with the classic “i before e” rule. They’re also keenly aware of how silly the rule is, and that it’s not even reliable. A language is useless if no one can learn its rules. The harder a language’s rules are to learn, the greater chance people will:</p>
<ul>
<li>Misunderstand how to use it</li>
<li>Not feel comfortable speaking to people</li>
<li>Stop trying to learn it</li>
</ul>
<p>Systems are especially difficult when components have different properties depending on its context. If you use words like “if,” “but,” and except” to explain how a component works, it’s time to reevaluate. Either streamline the component to remove conditional rules or break it up into separate, easier-to-use ones. I’m guilty of the example below.</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/dark-mode-issues.png#tocontent" alt="Dark mode issues">
<em>About that dark mode effort… Our initial palette forced some unfortunate one-offs, specifically how our inputs and buttons needed to slightly lighten on elevated surfaces to remain accessible. That treatment is something I’d love to take back.</em></p>
<p>Complicated or nonsensical rules won’t be followed. If you want to make a system that no one uses, make it hard to understand.</p>
<h2>OMGLOL</h2>
<p>Slang happens. People make up words. In a perfect world, those words still feel like they’re a part of the language. But they shouldn’t rehash another word for a different meaning (see: salty) or be gibberish (see: ROFL).</p>
<p>Custom components that aren’t a part of your system are like slang — and they can and should conform to the system’s rules. Plan for design-slang deviations and find a way to guide them to be compatible with the system. This is where higher-level guidance of how to design components is so helpful. If you don’t provide guardrails, you’ll be dealing with the UI equivalent of Thicc. Come on, two Cs?</p>
<p><img src="https://pjonori.blog/posts/design-systems-english-language/combo-button.png#tocontent" alt="Custom combo button.">
<em>Above is an example of a custom combo button created by one of our product designers. It lets people combine a list and a button (the “OMGLOL” in this situation), and easily fits into the system’s aesthetic rules.</em></p>
<h2>Epilogue</h2>
<p>It’s easy to overthink design systems. This isn’t to say that creating a design system is a piece of cake — it’s not — but we don’t need to make it harder than it already is. At the core of a design system, we’re trying to create logical, repeatable rules that allow people to “speak the language” competently, salty slang and all.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[An opinionated guide to designing a photography site]]></title>
            <link>/posts/photo-site-design</link>
            <guid isPermaLink="false">/posts/photo-site-design</guid>
            <pubDate>Tue, 15 Oct 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[So, you’re looking to make your own photography site. Oh boy, are you in for a ride...]]></description>
            <content:encoded><![CDATA[<p>I’ve been taking photos seriously for the past five years. During that time I’ve put a lot of time thinking about how to display photos online. Mainly because displaying your photos online with a modicum of quality is <em>hard</em>. I wanted to share my learnings and conclusions on the subject in the hope that it may prove useful.</p>
<h2>Consider the photo book</h2>
<p>Sure, books haven’t fared so well these past twenty years or so. We all know the convenience of accessing content online, but convenience doesn’t equate to effectiveness. The book format is simply a superior format for communicating the concept and vision of photographic work (I’ll get into why later).</p>
<p><img src="https://pjonori.blog/posts/photo-site-design/the-americans.jpg" alt="Robert Frank’s The Americans">
<em>Robert Frank’s The Americans</em></p>
<p>To be honest, you’re starting in the hole by publishing your work online. My suggestion is to take what’s best about the photo book format and translate it <em>as best as possible</em> into an online format.</p>
<p>Easier said than done.</p>
<h2>What makes the photo book so much better?</h2>
<p>Well, they have a distinct advantage. The book’s format never changes so photographs can be laid out explicitly to support the vision of the photographer. The book has a built-in interface (e.g., pages) so there’s no need for pagination or navigation or any other mess. The photos don’t need to be loaded, the book never encounters runtime errors, there’s no issues with rogue colorspaces, need I go on? A photo book can simply be about <em>photos</em>.</p>
<p><img src="https://pjonori.blog/posts/photo-site-design/gypsies.jpg" alt="Josef Koudelka’s Gypsies">
<em>Josef Koudelka’s Gypsies</em></p>
<p>The static nature of a photograph is a perfect fit the the static nature of a book. The photo books I resonate with do amazingly little more than present photographs how the photographer intended them to be seen. That is <em>incredibly</em> difficult to do in the web format. But that’s your job nonetheless.</p>
<h2>So, what’s this mean?</h2>
<p>This means that the process of designing a photography site is to remove as much from the screen other than the photographer’s intent. Just like the photo book’s spreads are intended to support the photographer’s style and message, so to should the site’s design. Support is a key word though—the interface should be <em>firmly</em> in the backseat.</p>
<p>That doesn’t mean the design isn’t important—<em>of course it is</em>. Design choices will be critical to support the message based on the subject matter, format, aspect ratio, etc. All of those choices summed up will lead to a unique set of design choices to best communicate the work.</p>
<p>So, put the photo front and center, develop a layout specific to the work and remove everything else. Easy to say, hard to do.</p>
<h2>Hard for many reasons</h2>
<p>Just the technicalities to achieve the above are difficult. Developing a layout design that supports the work is usually even more difficult. However, the most difficult thing of all may be fighting your own impulses.</p>
<p>The <em>great</em> thing about <em>great</em> photo books is that they’re focused. They usually encompass a single project and there’s little more in the book other than the work.</p>
<p>On the other hand, the vast majority of photography sites are exponentially larger in scope. They contain a photographer’s entire body of work, which necessitates navigating through projects. Then there’s the whole other litany of content the site supports, such as a bio, contact info, press, etc. Once you actually get to the content, there’s typically some UI to paginate/navigate through content.</p>
<p>Then there’s the invisible stuff which still ends up complicating matters. Modern sites often have custom typefaces which puts a strain on bandwidth. Don’t forget your analytics tracking, cookies, etc. Lastly, there’s the omnipresent social media buttons&#8230; I’ll leave that subject be, but suffice to say, it’s not <em>helping</em> showcase the work.</p>
<p>Mind you, the photograph hasn’t even been mentioned yet.</p>
<p>All of the above are voluntary, self-inflicted wounds that get in the way of the work. It’s your job to hide or preferably remove as much of the above as possible.</p>
<h2>Let’s get concrete</h2>
<p>I can’t tell you how do best display work I haven’t seen to convey the message I’m unaware of. However, I can give you some general suggestions to best set you up for success. First and absolutely foremost&#8230;</p>
<h3>Do not, under any circumstances, touch the photo</h3>
<p>The only entity that should be making creative decisions on the photography is the photographer. That seems straightforward, but it’s often ignored. Photos are often cropped to allow them to be full bleed on the screen—this is <em>horrible</em>. This effectively allows an arbitrary window size on someone’s device make the creative decision on how to crop the photo.</p>
<p><img src="https://pjonori.blog/posts/photo-site-design/minutes-to-midnight.jpg" alt="Trent Parke’s _Minutes to Midnight">
<em>Trent Parke’s <em>Minutes to Midnight</em>. This photo was almost assuredly cropped, but done so with the creative intent of the photographer. <em>Big difference.</em></em></p>
<p>On top of cropping, don’t cover it up. Don’t put captions on top of your photos—because then you often need an overlay background as well. It’s just a mess. Just put the text below the image.</p>
<p>Lastly, hover effects that mutate the image (e.g., scaling, opacity changes, color overlays, etc.) are a no go. You have no control over where a viewer moves their mouse—all you’re doing is setting up situations where the photo is not rendered how it was intended to look.</p>
<p>Note, the above doesn’t apply to cases when you’re using photos for navigation. But if you’re displaying a photo for the sake of people looking at it, please just leave it be.</p>
<h3>Make the photo big</h3>
<p>It’s a photography site, right? The photo should be the primary subject. That means you need to find ways to get as much off the screen as possible to give the photograph room to be large. Navigation, pagination, footers, social media buttons—they’re all getting in the way.</p>
<p>That said, I’d suggest not going full bleed—mainly because in doing so there aren’t explicit bounds to the photo. Is the photo being cropped by the screen or is it actually this size? Creating some margins around the photo removes that question.</p>
<h3>Show the photo quickly</h3>
<p>This is a bit more technical, but you really need to devote time and effort to get the photos to show up <em>fast</em>. Having an effective compression strategy, displaying an appropriately sized image for the screen size it’s being view on and image lazy-loading will all help. Make this a priority—it’s critical.</p>
<p>Not to beat a dead horse, but <em>not</em> loading social media buttons, analytics and other unnecessary distractions will help your site (and your photos) load faster.</p>
<h3>Keep the rest basic</h3>
<p>If you’re doing the first three things effectively, your next job is to do as little as possible to just not screw it up. Photography sites are about photography. They’re not about motion treatments, typographic self-aggrandizement or sophisticated UI designs. Beautifully vibrant or moody subtle colors should be coming from the photographs, not from the site design.</p>
<p>In short, the more anything else grabs the viewer’s attention, the less the photos will. That’s bad.</p>
<h3>Ignore any/all of the above if it conflicts with message you’re trying to convey</h3>
<p>Obvious, but worth explicitly calling out.</p>
<h2>How can I make this happen?</h2>
<p>Well, that’s the rub. When I went about putting my photos online, I had <em>absolutely no intention</em> to build my own site. It was time consuming and laborious. The problem is that I couldn’t find a single solution, free or paid, that met these needs. There isn’t a single photo site template that’s designed to meet <em>anyone’s</em> specific needs. That’s the exact opposite purpose of templates—they’re intended to be flexible. But in that flexibility I failed to see how most met anything more than the baseline criteria of getting your photos to show up in a browser.</p>
<p>This (unfortunately) meant that I had to make my own site. This also means I’m implicitly suggesting the same to you as the reader. Which is what most people probably do not want to hear. But first things first, I <em>highly</em> suggest you go to a library and look at some photography books. A good place to start is <a href="https://en.wikipedia.org/wiki/The_Americans_(photography)">The Americans</a> and/or <a href="https://www.magnumphotos.com/arts-culture/alex-webb-the-suffering-of-light/">The Suffering of Light</a>. Give them a gander and see if the format resonates with you. If so, the work will be worth it.</p>
<h2>Prologue</h2>
<p>At the risk of getting too philosophical, now is a good time to ask yourself <em>why</em> you want a photo site to begin with. If the honest answer is that you want to make a name for yourself or grow a social media following then you’re in luck! Don’t waste your time wrestling with how to best display your photographic work on this inhospitable platform. Just sign up for Instagram and post your work there—it’s honestly a better use of your time.</p>
<p>However, if you’re looking to present your work with as much creative control as possible and don’t have a publisher or gallery knocking on your door to help make that happen, you may be stuck where I was. Hopefully a little further ahead after reading this.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Making a design system is a people job]]></title>
            <link>/posts/design-systems-are-a-people-job</link>
            <guid isPermaLink="false">/posts/design-systems-are-a-people-job</guid>
            <pubDate>Wed, 06 Feb 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Think designing buttons is tough? Try convincing everyone in your company to use it.]]></description>
            <content:encoded><![CDATA[<p>Designs systems are all the rage. They’re discussed to the nth degree and their benefits <em>can</em> be very real. Yet, there’s nothing easy about building a successful design system. There are a million different things that can steer you off the road and many of them have nothing to do with <em>design</em>.</p>
<p>I’ve worked on a design system or two in my time and have learned a lot through each process. The most important lessons I’ve learned uncoincidentally have little to do with design. Instead they’re are about the factors and approaches that set teams up for success.</p>
<p>With that said, these are my personal learnings. There’s ample room for disagreement or different conclusions. Like most things, your mileage may vary.</p>
<h2>Design systems help good teams work better</h2>
<p>Design systems are great, but they are nothing more than a <em>tool</em>. Like any other tool, they are an amplifier of strong fundamentals. Design systems won’t fix people/cultural problems. They won’t help you get along with your colleagues. They won’t make those who don’t value design to magically see the light. Design systems are a tool to use — when adeptly wielded, they can help people be more effective.</p>
<p>It’s critical to not put the cart before the horse. Get the foundational aspects of your practice right. You need that strong foundation to ensure your tool is adeptly used. Design systems, like any other tool wielded in the wrong hands, can do a lot of damage. The dysfunctions within your team/org will manifest in your system. If there’s no cross-functional collaboration or teams can’t drive to actionable decisions, those problems will plague your design system.</p>
<p>Your team’s output is a reflection of your company’s culture and the people that work in it. Nail down the fundamentals of a strong design practice — its people, culture and relationship with the greater org. This will set you up for success when you create your design system, or anything else for that matter.</p>
<h2>Design systems need commitment and a mandate</h2>
<p>I’m not the kind of guy that enjoys the idea of forced mandates. I think it’s often abused and employed for the wrong reasons. But I do believe design systems need commitment and (yes) a mandate for them to take hold. The bigger the company, the more explicit that mandate should be. Let me explain why.</p>
<p>Building a design system is tough in the best of times. It’s all the more difficult in large orgs with disparate/disconnected teams. That’s ironic as they’re where systems can provide <em>serious</em> value. You’re going to push up against human dynamics like skepticism, disagreement and territorialism. You’ll face nuts-and-bolts challenges of making a system that <em>actually works</em> for all involved. There will be hiccups, mistakes, misunderstandings — you name it. You’ll struggle with the transition pains as teams move to your new, fledgling system. None of these no fall within the realm of “fun” — for anyone.</p>
<p>Any of the issue above will make it tempting for teams to bounce when the project hits a pothole. The rationale will be rational; Team A needs to ship a new feature <em>now</em> and migrating to the design system will slow that down. Team B’s designer is a rock star and your system will stifle her ability to deliver tailor-made solutions. The tough thing is their concerns are valid — when assessed in a vacuum.</p>
<p>That’s why there needs to be a clear message — from leadership — that states, “This is what we’re doing. We need everyone to help make it succeed”. It has to be a collective understanding that the system is for the collective benefit. While each team is going to feel a little pain, the goal is a net positive effect. The only way for that net positive effect to take hold is if everyone is pushing in the same direction.</p>
<p>Without that mandate, there’s a good chance you’ll be herding cats. Cats that don’t report to you.</p>
<h2>The hypotheticals will kill you</h2>
<p>It’s easy to see need for <em>another component, another color, another xyz</em>. <em>Need</em> is a strong word and usually confused with <em>desirable</em>. The more colors, type treatments, or <em>whatever</em>, you add to the system, the more complexity you own. More complexity means more maintenance, bugs, regressions, confusion, misinterpretation and general headaches. Be <em>very</em> careful what you commit to. It’s <em>much</em> easier to add things to a system than it is to remove them. Complexity is the rope you’ll hang yourself on.</p>
<p>Discipline yourself to keep your system as small as possible. Focus on existing, real-world team needs and address them with the simplest solution. Yes, you won’t have everything people want. Yes, there will be gaps. And, <em>yes,</em> those gaps mean you may need to re-evaluate past decisions (more on that later).</p>
<p>I’d argue a little thrash is far more healthy than a bloated system that can no longer get out of its own way.</p>
<h2>Design systems are a product with three distinct and equally-important cohorts of users</h2>
<p>Design systems are not only for people interacting with its byproduct. These systems are as much for the designers and developers using it to build interfaces. If the system doesn’t help designers create better solutions, they won’t design with it. If developers hate building with it, they won’t build with it. If either design or developers resist, there’s a good chance it the end-consumer won’t see it either.</p>
<p>Design systems need to <em>equally</em> serve three cohorts — designers, developers and end-consumers. Designers and developers need the tools (e.g., interface components) and resources (e.g., usage guidelines) to help them succeed. The system needs to objectively make them to be more effective at their job. It doesn’t hurt if it makes work more enjoyable as well.</p>
<p>The challenge is to provide enough tools/resources to help them succeed. But not <em>too much</em> where it becomes restrictive. Your system is never going to have all the answers. But, it <em>can and should</em> be your team’s design philosophy made manifest. Meaning your system should communicate the principles needed to guide going “off-script”.</p>
<h2>There will be thrash, so have a plan to mitigate it</h2>
<p>You’re going to get a lot wrong in your system out of the gate. It’s just going to happen. You’ll discover you had no idea what you had no idea about. Then you’ll have to make changes — sometimes drastic ones. Meaning there will be thrash. And thrash <em>is not fun</em> for the people consuming your system.</p>
<p>I am fully committed to the notion that thrash is a good thing. It means you’re committing to a direction, learning from its execution and then adjusting. But for the sake of the people using your system (and your relationship with them) it can’t be a constant. You shouldn’t fear thrash, but you need to know when it’s useful and how to help mitigate its downsides.</p>
<p>One of the best way to mitigate the downsides of thrash is to start small — with <em>everything</em>. Keep the system small, keep the documentation small, keep its user-base small. It’s crucial to limit how many people you involve. Any major thrash (like the near-180-degree turns) should occur as early as possible in the system’s lifespan, before the cement fully “hardens”.</p>
<p>It’s also important to only expose teams to thrash that are comfortable with it. You often need as many champions as you can get in the infancy of a design system. The last thing you want to do is create unneeded doubt and frustration.</p>
<h3>Here’s how I like to go about kicking off a design system:</h3>
<ul>
<li>Start with a core set of designers. Make sure the system’s design fundamentals support their core needs — or at the very least don’t hinder them. This isn’t only about missing components/states. The guidelines need to make sense, and the support materials set them up for success. Start building once you get thumbs pointing up.</li>
<li>Once you’ve coded out your teeny-tiny design system, you go through the same exercise with a core set of devs. Make sure they’re on board with how you’ve constructed components and that they’ve enough guidance.</li>
<li>With design and dev loosely vetted, it’s time to test it on something real. Engage with one team on a project that isn’t time-sensitive or mission critical. Bonus points for teams that are comfortable with ambiguity.</li>
</ul>
<p>The above assumes you’re constantly evolving the system based on learnings and communicating them out. All this is in the spirit of maximizing learning while mitigating risk. As you learn from these small iterations, you’ll gain confidence that the system is ready for broader use. You don’t need to go out the door with everything if teams can see it’s headed in the right direction.</p>
<p>The “big reveal” approach is not advisable. You’ll be at the pre-release stage forever if you try to solve every potential solution from day one. Which means no one is <em>using</em> your design system — which defeats the point.</p>
<h2>Making it is the easy part</h2>
<p>So your design system hit the 1.0 milestone and is in circulation. Now comes the hard part. You’ll deal with training, governance, avoiding bloat and maybe the trickiest, managing progress.</p>
<p>Let me clarify — when I say managing progress, I’m not talking about the progress you see from 1.0 to 1.0.1 or 1.1. I’m talking about the progress from 1.0 to 2.0. It’s inevitable that <em>almost everything</em> that you make in the system — no matter how good — will run its course. Interface paradigms change, new platforms show up and the product you built the system for evolves. There will come a time when you’ll have a critical mass of ideas to improve your system based on the new reality of <em>today</em>.</p>
<p>If your system stagnates, your product will as well. Meaning you risk you design system becoming a liability. You <em>can’t</em> stop improving the system, but it also <em>can’t</em> be an agent of chaos within your org. I haven’t come across one-size-fits all solutions for these problems. You need to have an idea of what works for <em>your</em> system and <em>your</em> stakeholders. It doesn’t need to be a perfect answer, but you need to at least plant a flag in the sand. You may end up supporting multiple versions to give teams some flex on when they migrate. You may risk creating more forward-thinking solutions so they have a longer half-life. You can do a lot of things, but what’s most important is you have a plan that works for everyone invested in the system.</p>
<p>In short, you’re never <em>done</em> with your system. That’s something that everyone needs to be keenly aware of before committing.</p>
<h2>Bonus: We’re designing with systems backwards</h2>
<p>This point is a little less actionable, but I’m putting it here for folks to chew on. I posit that the way we apply design systems within the design practice is 180 degrees from where it should be. The value of code-backed design systems (what I like to call “design systems”) is that it’s <em>theoretically</em> a single source of truth. That’s not the case for 99.9% of teams though. In reality, we have two sources of truth. We have the the code-backed design system and an ancillary library of symbols for our design tool du jour. This is a <em>big</em> problem.</p>
<p>It’s a big problem because we’re not working from that elusive single source of truth. This is humorous since it’s one a core selling point of design systems yet it’s rarely ever the case in practice. It’s all too easy for a code-backed design system and its supporting design library to bifurcate. Bifurcation starts small and then all those small things add up. Then the questions and confusion begin. Sure, you can dedicate processes and time to keep the two in sync. But then you’ve dedicated processes and time to keep the two in sync. Meaning you’re losing out on other areas of opportunity that aren’t (dare I say) busywork.</p>
<p>The source of truth in product development <em>needs</em> to be whatever is going to show up in production. That happens to be code. The problem there isn’t a go-to solution to design with code-based components. We’re just limited by what’s possible. But there’s movement to meet this need and it’s well worth keeping an eye on. AirBnB’s <a href="http://airbnb.io/react-sketchapp/">Sketch React</a> and <a href="https://framer.com/">Framer X</a> show the promise of a very different future. But they are still very much in that <em>promise</em> stage. I look forward to when <em>something</em> makes good on it.</p>
<h2>Let’s wrap this up</h2>
<p>So that’s it. Those are the most important things I’ve learned in my time creating systems. Adobe XD, Figma or Sketch? Who cares. React or Angular? Whatever. Design tokens? Sure. The thing about those things is that they’re all temporary. The real, immutable challenge involves people and the people-stuff that’s <em>always</em> hard. It’s hard to get buy-in, align teams and create a shared understanding that <em>everyone</em> is embarking on a ride. A ride that’ll likely involve turbulence.</p>
<p>Make sure your team is ready, willing and able (in the literal sense). Get everyone to commit. Have a healthy fear/respect for complexity and hypotheticals. The rest is downhill from there.</p>
<p>So, to try to sum this all up in one sentence — Make it small, make it real, make it quickly — when your org is ready.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Writing is design]]></title>
            <link>/posts/writing-is-design</link>
            <guid isPermaLink="false">/posts/writing-is-design</guid>
            <pubDate>Tue, 05 Jan 2016 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>I have long held the opinion that writing is crucial to design. Unfortunately I did not practice it. Writing was not given much priority while I attended art school and continued to be of little concern early in my career. I took my writing seriously once my wife began editing my blog posts. The first few sessions were rough. I was failing at the most fundamental level—I wasn’t getting a point across. Ironically, design is <em>all about</em> getting a point across.</p>
<p>I am not suggesting that the design community considers writing unimportant. It is just treated as <em>something else</em>. The aesthetics of the visual and textual will continue to be disconnected until that changes. Writing is design. There is no separation.</p>
<p>Designers devote endless hours to make their solutions more elegant. They understand the importance of detail. They cherish clarity and simplicity. The same isn’t often said about their craftsmanship of words. Dieter Rams published the <a href="https://en.wikipedia.org/wiki/Dieter_Rams#Dieter_Rams:_ten_commandments_for_good_design">ten principles of design</a> which guide many in the practice. Below is a derivation of Ram’s principles to illustrate how writing and design are often one and the same.</p>
<h2>Good writing is reader-focused</h2>
<p>Your writing’s content, style and format should benefit your readers. Publishing content to fit a schedule, prop up traffic or just rant wastes readers’ time.</p>
<h2>Good writing is trustworthy</h2>
<p>Readers have to know they read is honest, genuine and fair. Writing that lacks any of those qualities erodes credibility and trust.</p>
<h2>Good writing makes its subject useful</h2>
<p>Writing has limited impact if readers can’t relate to the subject. If they can’t relate, they can’t “use” it. Informing is prerequisite, empowering is ideal.</p>
<h2>Good writing is unobtrusive</h2>
<p>Writing does not need to be verbose to be smart. Communicate with the most accurate, simple words.</p>
<h2>Good writing is focused</h2>
<p>A good piece of writing concentrates on the subject. Tangents dilute and create confusion.</p>
<h2>Good writing provides novel information and perspectives</h2>
<p>Writing should have something useful to say. Piling on a subject with nothing new to share helps no one. Better to direct readers to a well-written piece than duplicate it.</p>
<h2>Good writing is aesthetically pleasing</h2>
<p>Content should be enjoyable to read. The meaning of words should carry as much beauty as their visual representation. Well executed typography without well executed writing is missing the point.</p>
<h2>Good writing is well-crafted</h2>
<p>Typos and grammatical errors are unacceptable. Writers should strive for a technically flawless reading experience.</p>
<h2>Good writing is succinct</h2>
<p>Every word written should count. Any paragraph, sentence or word lacking significance wastes the writer’s and the readers’ time.</p>
<h2>Good writing is long-lasting</h2>
<p>Trends may affect subject matter and language. Ideas shouldn’t have an expiration date.</p>
<p>Communicating ideas has been and continues to be a primary goal of design. Designers spend considerable effort to convey complex emotions, processes and concepts through visual abstractions. These endeavors have merit and provide results. Yet a simple, well-written sentence is often more effective.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Everything is a prototype]]></title>
            <link>/posts/everything-is-a-prototype</link>
            <guid isPermaLink="false">/posts/everything-is-a-prototype</guid>
            <pubDate>Sun, 04 May 2014 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Interaction design is in constant change. Code is becoming a design medium, making prototyping a common design process. This is a step in the right direction, but is missing the point. Prototyping is not a step that designers check off the list. It’s what designers do. Everything designed is a prototype.</p>
<p>By everything, I mean <em>everything</em>. Sketches, wireframes, visual comps, clickable demos, beta releases, version 1.0 and version 2.0. They’re all a prototype for what comes next. This could be seen as arguing over semantics, so let me explain why this distinction is important.</p>
<p>We build prototypes with the explicit purpose of learning. Good prototypes don’t get bogged down in the details until necessary. Thus, they’re streamlined and fast. There’s a clear acknowledgement of “I don’t know”. Changed is assumed and failure, to varying degrees, is an expectation. Understanding is the product of a prototype.</p>
<p>When working to make something exactly right, the blinders go on. We can spend a disproportionate amount of time fussing instead of learning. More than often you find a fundamental flaw in your thinking; all your time fussing was for not. This process is inefficient and hit-or-miss.</p>
<p>Today’s digital products have short lives. Technologies change, expectations change. The things designers obsess over today are forgotten tomorrow. What persists is the knowledge uncovered through the process of creation. It’s those learnings that will make the next manifestation better. That’s why viewing design as a constant state of prototyping is important. It puts us in a state of fluidity, a openness to learn and respond. The focus is on learning.</p>
<p>The worst kept secret about design is no one knows if something will work until it’s tried. Even time-tested approaches can fall flat given the right (or perhaps wrong) circumstances. I like to say that the first try isn’t what’s important — it’s the <em>second</em> try. What happens between those two steps is what matters.</p>
<p>You’re obviously going to apply this principle differently in a sketch than a GA launch. The experiments taken with mature products will be more subtle and focused. This approach can be applied to any of the traditional steps in the design process. It’s more a way of designing than a particular kind of output.</p>
<p>Human beings are not perfect. As such, the things we make are imperfect as well. However, we have an amazing capacity to learn and adapt from our mistakes. It only makes sense then to focus less on perfect and more on slowly, constantly better. The process of design should improve <em>yourself</em> as much as what you’re designing.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[Design for speed]]></title>
            <link>/posts/design-for-speed</link>
            <guid isPermaLink="false">/posts/design-for-speed</guid>
            <pubDate>Tue, 02 Apr 2013 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Have you ever asked a person a question where there is an unnatural delay in the response? It’s unsettling. You’re left questioning if the person heard you, if they understood, or if they’re just ignoring you. People expect a response in a certain amount of time, otherwise things get weird. The same can be said with peoples’ expectations of software. When they click a link, they expect the page to load within a certain amount of time. When they tap a button, they expect an immediate response. Otherwise things get weird. Speed needs to be a core tenant of software design in order to make good on that contract.</p>
<h2>Why Speed is Important</h2>
<p>The breaks between loading times or interactions create breaks in experience. Speed often has a <a href="https://blog.kissmetrics.com/loading-time/">greater impact on experience</a> than what’s typically focused on in design. Page loads are more important than ever when considering mobile devices. A 500Kb page size may be annoying on desktops, but it can prove unusable on mobile. Responsive design is not just about fitting a website nicely in a smaller screen. It is also responsive to bandwidth, lower computing power and other less celebrated constraints.</p>
<h2>Tips to Shape Your Thinking</h2>
<h3>Consider time as a core dimension of user experience</h3>
<p>Speed has traditionally been considered an engineering topic and been ignored by most designers. Yet design often makes or breaks performance before a single line of code is written. The temporal experience of a product (e.g., page load speeds, app performance and anything else that impedes fluidity) is foundational to the practice of interaction design. Translation: A design is unsuccessful if it sufficiently impedes performance.</p>
<h3>Understand how design can impact speed</h3>
<p>Grasping the basics of design’s impact on speed is simple. Digging into the nitty-gritty of performance is quite difficult. The basics are obvious: large files and many requests will take more time to download. Anything delivered to the user <em>takes time</em>. The challenge is uncovering the less obvious. Issues like avoiding expensive database queries or CPU-intensive tasks. The main takeaway is that <em>every decision</em> has an impact. The goal is to take a preventative approach towards the basics and to work closely with developers to avoid the less obvious.</p>
<h3>Determine where speed resides in the hierarchy of experiences you’re designing</h3>
<p>Every designed experience has a hierarchy of needs. Those needs shift in priority based on the product’s focus or the people it&#8217;s for. While speed may not always be at the top of the list in needs, it should always be part of the equation. Understanding the importance of speed in the experience will inform your compromises.</p>
<h3>Make every element justify its existence</h3>
<p>Designers already know that every pixel on the screen needs to be accounted for; every interaction justified. That same approach should be taken towards speed. Each request, byte and query added should be intentional and markedly improving the experience. If not, it should be gone.</p>
<h3>Treat bytes like pixels</h3>
<p>It’s great to see an increased attention to craft, simplicity and a pixel-level focus in interface design. That same tenacity towards aesthetic and reduction needs to be directed towards performance. This means optimizing your images, cleaning your HTML, CSS and Javascript. Make your sites pixel-perfect <em>and</em> byte-perfect.</p>
<p>The points above are not far off from what’s typically prescribed for effective design. The difference is that designers normally talk about stripping things away to simplify interaction. Those same practices of refinement and reduction yield equally worthwhile results for faster web experiences. The world will thank you.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
        <item>
            <title><![CDATA[In defense of hard]]></title>
            <link>/posts/in-defense-of-hard</link>
            <guid isPermaLink="false">/posts/in-defense-of-hard</guid>
            <pubDate>Tue, 08 Jun 2010 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Once upon a time, software was a tool used in a professional setting. That seems like a lifetime ago. Software is now engrained in daily modern life. Far from the professional tool, it’s for everyone. Usability and ease-of-use were less of a concern (if any concern at all) before this shift. Software companies could rely on training and manuals to make up for unintuitive interfaces. That all changed as software became more consumer-focused. A strong emphasis was put on reducing friction and cognitive load to encourage adoption — and it worked. The problem is that it may have worked <em>too well</em>. As software becomes more frictionless and intuitive, there’s less inconvenience to remove. With most of the annoying and unnecessary friction gone, we’ve started to cut the kind of friction that can be vital to growth and accomplishment. In doing so, we’re stripping out the opportunities for positive experiences.</p>
<h2>When easy becomes vapid</h2>
<p>The line between simple and simplistic is subjective. No one wants unnecessary complexity. However, we cross the line when simplifying a concept negatively impacts the user. An example is the ubiquitous auto spell check feature in today’s software. While convenient, it can become a crutch leading some unable to adequately proofread.</p>
<h2>Vapidity lets people down</h2>
<p>Designers put immeasurable time and resources into removing cognitive load from our daily interactions. On the surface, there is nothing wrong with this, yet, overemphasis on easy comes at a cost. This effort often results in a shallow derivative of the subject’s original form, trivializing both subject and user. The premise for removing difficulty is justifiable. Many people feel intimidated when presented with too much complexity. Yet the conclusion to remove complexity at any cost misses the mark. The simplification-at-any-cost approach leads to potentially innovative solutions being dead on arrival if they have the unfortunate side-effect of a learning curve.</p>
<p>Simplistic products give a false impression of competence which removes the incentive to learn. This illusion of aptitude ultimately wastes peoples’ time. It either creates dependency on the product or let-down when people discover their domain knowledge was never adequate.</p>
<p>An example of trivializing important, complex experiences is found on legacy.com. The website takes the burden out of sharing your condolences by <em>writing them for you</em>.</p>
<p>There should be nothing easy about writing the condolences for the loss of a loved one. This is a prime example of how over-simplifying tasks robs opportunities for growth. When we automate something so fundamentally human, we strip out our most essential experiences. Making the naturally complex unnaturally simple treats neither the subject or the user with respect. This denies people the skills they need to perform a task when it inevitably becomes necessary.</p>
<p>No one advocates for designing solutions that are unnecessarily obtrusive or convoluted. We should not need to “walk in the snow uphill both ways” for every single thing we do in our lives. Yet we should also not create the false impression that one can walk downhill both ways.</p>
<h2>Recommendations</h2>
<p>Our goal should be to transform the <em>difficult</em> into <em>rewardingly challenging</em>. While nothing below is particularly new, they are still worth noting.</p>
<h3>Challenge people (in the right ways)</h3>
<p>Expect more of your users and make your product worth their time. Some of our most rewarding moments come from overcoming challenges. Not the convoluted, time-wasting moments, but the difficult, yet important tasks that we had to work through. Why then would we shy away from presenting these types of opportunities to our audiences? Software should expect or even a demand people to learn and grow to “get to the good stuff”.</p>
<p>Determining the correct level of difficulty is necessary for a fulfilling experience. Too elementary, and the value to engage is questionable. Too onerous and immediate frustration kicks in. Regardless of its difficulty, this equilibrium is crucial to maintaining a state of flow. <a href="https://en.wikipedia.org/wiki/Mihaly_Csikszentmihalyi">Mihaly Csikszentmihalyi</a> states one of the three conditions for flow is, “… a good balance between the perceived challenges of the task at hand and his or her own perceived skills. One must have confidence that he or she is capable to do the task at hand.”</p>
<h3>Honest trumps simple</h3>
<p>Superficially presented subjects lead to superficial understandings of them. In dumbing down our language, concepts and processes, we often warp their true form. Some tasks are just tough. Some require weeks, months, or years of practice to become proficient. That’s OK. It’s our responsibility to be upfront about this and to help encourage/empower users’ growth. It’s irresponsible to insinuate a shortcut exists when it doesn’t.</p>
<h3>Simple, with depth</h3>
<p>Some of the most successful products don’t take much time to learn, but take a long time to master. This comes from drawing out the subject’s full complexity until the user is ready for it. The elementary is obvious, the advanced is more subtle. An example of this is the OS X close button’s unsaved state. If a file has unsaved changes, the close button will have a dark dot in the middle.</p>
<p><img src="https://pjonori.blog/posts/in-defense-of-hard/unsaved-changes.png#tosize" alt=""></p>
<p>Explicit? No. Yet I doubt that was the intention of this design decision. It was there, adding depth to the experience if/when it was noticed, but not critical if missed.</p>
<h3>Articulate the importance of complexity rather than avoid it</h3>
<p>If a subject is naturally complex, work to make it no more complex than it needs to be — but no less. People are not averse to complexity, but they need to know it’s worth their time and energy. Educating them on how to do something is not enough, there should be education on why it’s important. People enjoy learning if the subject is engaging.</p>
<p>Challenging users in the correct manner will lead to them being more self-sufficient. Informed users have a better idea of what they want and can better articulate why they want it. A person engaged with a subject is more willing and able to grow with it.</p>
<p>The task to make difficult processes simple, while preserving their true form is significant. Selling it to people can be even more difficult. For myself, the debate is not whether it is necessary, but where the line is drawn. No matter where each of us land on this line, if designers take the easy way out, we can expect no better from users.</p>
]]></content:encoded>
            <author>pj@pjonori.com (PJ Onori)</author>
        </item>
    </channel>
</rss>