<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Savannah on Medium]]></title>
        <description><![CDATA[Stories by Savannah on Medium]]></description>
        <link>https://medium.com/@savbb?source=rss-4d79ab390a10------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*vH8jLQpDyLdLPJ05AG9xTg.jpeg</url>
            <title>Stories by Savannah on Medium</title>
            <link>https://medium.com/@savbb?source=rss-4d79ab390a10------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 04:13:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@savbb/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[What I Learned Studying How Product Managers Use AI]]></title>
            <link>https://medium.com/@savbb/what-i-learned-studying-how-product-managers-use-ai-f1ad5383b959?source=rss-4d79ab390a10------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1ad5383b959</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[qualitative-research]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[hcde]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[Savannah]]></dc:creator>
            <pubDate>Wed, 01 Jul 2026 17:52:48 GMT</pubDate>
            <atom:updated>2026-07-01T17:52:48.101Z</atom:updated>
            <content:encoded><![CDATA[<p><em>What five product managers actually do with AI, and what they will not hand over.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fz9TTFoeGgK2Bf5_tguRyA.png" /></figure><p>When I signed up for HCDE 519, a qualitative research methods course, I figured I would walk away knowing how to run a decent interview and code a transcript without losing my mind. I did learn that. But the part that stuck with me was the topic my team picked: what happens to product managers when generative AI starts showing up as a coworker.</p><p>It is a strange moment to be a PM. Something like 78 percent of tech companies are already poking around with AI internally, and a majority say they plan to bake it into how their people work. PMs sit right in the middle of that shift. Their whole job is to translate between design, engineering, and the customer, and suddenly there is a tool that can draft, summarize, and reformat all of that in seconds. So my group asked a simple sounding question that turned out to be anything but:</p><blockquote><em>How does adopting generative AI in a PM’s day to day actually redefine their role and reshape how they work with their teams?</em></blockquote><p>Here is what we found.</p><h3>How we did it</h3><p>We kept the method honest and small. Five product managers, all based in the US, spread across different sectors and different stages of their careers, from early career to senior. We ran semi-structured interviews over Zoom, each one running about 45 to 60 minutes. We started with a pilot interview to shake out the bad questions, then did our main round.</p><p>That pilot humbled me more than I expected. I went in with a protocol I was a little proud of, and within ten minutes I watched my carefully worded questions produce pretty uninteresting answers. The ones that actually opened people up were the plain sounding follow ups: “can you walk me through the last time you did that?” I came out of it having rewritten half my questions, and with a new respect for how much of good interviewing is just active listening.</p><p>The fun and slightly painful part came after. We coded everything collaboratively using Taguette. To cut down on bias, each of us analyzed a transcript from an interview we did not personally run, so I spent my first real coding pass inside a conversation a teammate had led, which forced me to read closely instead of leaning on what I remembered hearing. Then we sat together, argued politely about what each code meant, and slowly merged our messy individual codebooks into one shared codebook. This part was harder than the interviews. I learned that two people can read the same sentence and tag it completely differently, and that the disagreement is the point, not a problem to rush past. Talking through why we each saw it differently usually produced a sharper code than either of us started with. We sorted everything into five buckets: role, changes, challenges, feelings and opinions, and tool usage. Out of that came the themes I am about to walk through.</p><p>The tools our participants reached for most often will not surprise anyone: ChatGPT, Claude, Gemini, Copilot, and a handful of internal company tools.</p><h3>Finding 1: AI is a first draft machine</h3><p>The clearest pattern was that PMs use AI to start, not to finish.</p><p>Almost everyone we talked to works inside strict document templates. Funding docs, one pagers, product requirement documents, each with its own required format and tone. AI turned out to be great at getting them off a blank page. One participant described uploading a transcript and notes and getting a structured one pager from their template back in about a minute, then editing from there. As they put it, starting from scratch was not their strong suit, and a tool that hands you a solid launch point changes the whole rhythm of the work.</p><p>The more sophisticated users were not just typing requests. They were engineering reusable prompts with formatting rules, tone guidance, and personas baked in, so the AI would mimic their company’s house style without being told every single time. One PM built a persona with a standing list of instructions so they did not have to repeat “follow the style guide” on every prompt.</p><p>The second half of this finding was about communication, not documents. PMs used AI to tailor a message for a specific audience and to pressure test it before sending. One person described stressing over the wording of an email to a vice president, then asking AI to rewrite it through a persona to make it land better. Another used it almost like a sparring partner, asking what questions a particular type of leader might raise and what resistance to expect.</p><h3>Finding 2: Faster, yes. Hands off, absolutely not.</h3><p>Everyone agreed AI sped up the boring parts. The repetitive, low brainpower work of formatting to spec and filling out routine docs got dramatically faster. One PM said it well: same responsibilities, same tasks, just done more quickly, which freed them up to focus on the actual substance of what they were trying to communicate.</p><p>But speed came with a tax, and the tax was judgment.</p><p>Generative AI does not know the context that lives in a PM’s head. It does not know the hallway conversation from last week or the decision the team already made and moved past. So our participants spent real time correcting tone, clarifying context, and reining the model back in when it started optimizing for the wrong thing. One person described how a single unclear detail in a prompt could send the whole output sideways, with the AI trying to solve problems that were already solved or were never in scope.</p><p>And then there is the trust problem. A few participants brought up hallucination directly. The fear was not that the AI is wrong, it is that it is confidently wrong. As one PM put it, the model fills gaps in its knowledge with whatever it thinks is a good answer, and if you are not deeply familiar with the content, it is genuinely hard to catch when it has made something up. That is the part that keeps a human firmly in the loop.</p><h3>Finding 3: Ownership</h3><p>PMs are not handing their work over to AI, and they are very deliberate about it. They have landed on a hybrid model: use AI for efficiency, not for automation. The traditional manual process was slow, but it gave them a deep sense of authorship and a real command of the material. They are not willing to trade that away.</p><p>One participant gave us the cleanest definition of ownership I have heard. For them, owning a piece of work meant being able to answer roughly 90 percent of any question someone might ask about it. That is the bar. And they noticed something: the more you lean on AI to create something, the less ownership you tend to feel over it. So they stay on top of that tension on purpose instead of pretending it is not there.</p><p>PMs see their value in knowing their work well enough to stand behind every decision in it, and they are protecting that on purpose.</p><h3>Finding 4: The role is getting bigger</h3><p>The last theme was about how the job description is shifting.</p><p>Several participants described brand new responsibilities layered on top of their existing workload. The standout example was the “AI ambassador,” a real role one participant held. It was a top down initiative where leadership tapped one ambassador per team to run lunch and learns, share prompts and policies, demo what good usage looks like, and help everyone else get comfortable. New expectations were showing up too, like accounting for accuracy, testing, and baseline metrics, partly to secure funding and partly to measure whether the AI is actually helping.</p><p>Underneath the formal stuff was something more grassroots. Without any real training, PMs are learning AI socially. Nobody emailed them a manual. As one participant described it, the message from leadership was basically “we found this thing, go experiment, figure it out, and share what you learn.” So people swap tips in team meetings, in one on ones, in Slack channels, and on LinkedIn. They are writing the best practices together.</p><h3>So what should AI tools actually do about this?</h3><p>Because this was a design course at heart, we did not stop at observations. We turned the findings into recommendations for anyone building AI tools for knowledge workers. Four of them stood out.</p><p><strong>Offer a “learning mode.”</strong> Tools should recognize recurring task patterns and proactively suggest context aware prompts. Think fill in the blank prompt builders that nudge users to include audience, tone, objective, and constraints. This lowers the barrier for less experienced users and makes the output better on the first try.</p><p><strong>Show your work.</strong> Source transparency and explainability matter a lot when trust is the bottleneck. If a tool can surface its reasoning and where its information came from, PMs can validate accuracy before they stake their name on it.</p><p><strong>Protect human ownership.</strong> Tools should augment, not replace. A small move like occasionally asking “do you understand why this was suggested?” keeps the person engaged and reinforces their sense of authorship instead of chipping away at it.</p><p><strong>Make space for the conversation.</strong> Since so much learning happens informally, organizations benefit from a central place for it. A simple internal hub covering why to use AI, the guidelines and data policies around it, and a library of prompts and FAQs can turn scattered experimentation into shared knowledge.</p><h3>What I would do differently</h3><p>If I had more time, I would push this further. The obvious next step is longitudinal work, tracking the same PMs over two or three years to see how the role really settles, because right now we are catching a snapshot of a fast moving target. I would also love to shadow people and watch how they actually use AI in the moment, rather than relying only on how they describe it. And I would widen the net to include more industries, more company sizes, and especially veteran PMs with 15 plus years in the role, along with people in slow moving, heavily regulated fields who are probably adapting in completely different ways than the agile tech crowd.</p><p>I also want to be honest about what five interviews can and cannot tell you. With a sample this size, what we found are patterns, not proof. The themes showed up consistently enough that I trust them as signals, but I would be careful about turning any of them into a confident claim about all PMs everywhere. The “AI ambassador” role, for example, was real and striking, but it came from one person at one company. I treat it as a thread to pull on, not a trend I have established. Knowing where that line sits, between what the data suggests and what it actually supports, felt like one of the more useful things I took away from the whole project.</p><p>The piece I am most curious about, though, is whether my recommendations actually hold up in practice. Right now they are educated guesses built from interviews. I would want to put them in front of the same PMs, have them try out things like a guided prompting mode or a source transparency feature in their real workflows, and then come back and tell me what helped and what got in the way. Testing the ideas with the very people who inspired them would turn this from a set of observations into something I could actually stand behind.</p><h3>The thing I keep coming back to</h3><p>The headline fear about AI is replacement. What our small study actually found was something messier. AI is not erasing the product manager. It is taking the tedious parts of the job off their plate and, in the process, putting more weight on the parts only a person can really do: judgment, context, ownership, and the slow work of getting a team to understand each other.</p><p>The PMs who seemed happiest were not the ones who automated the most. They were the ones who figured out exactly where to let the tool drive and where to keep their hands firmly on the wheel.</p><p>If you are a PM reading this, that is the move I would steal. Let AI own the blank page and the formatting tax, the stuff that drains your time without using your judgment. Then guard the parts that are actually yours: the context, the strategic call, the ability to answer 90 percent of the questions about your own work. Speed is easy to get now. Ownership is the thing worth protecting.</p><p>That feels like a pretty good lesson for the rest of us too.</p><p><em>This was a team project for HCDE 519, Qualitative Research Methods. Huge thanks to my groupmates and to the five product managers who gave us their time and their honest opinions.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1ad5383b959" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What Building a Dog Puzzle Feeder Taught Me About Product Management]]></title>
            <link>https://medium.com/@savbb/what-building-a-dog-puzzle-feeder-taught-me-about-product-management-ff7aa8c199d5?source=rss-4d79ab390a10------2</link>
            <guid isPermaLink="false">https://medium.com/p/ff7aa8c199d5</guid>
            <category><![CDATA[university-of-washington]]></category>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[dogs]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[hcde]]></category>
            <dc:creator><![CDATA[Savannah]]></dc:creator>
            <pubDate>Mon, 15 Jun 2026 20:14:04 GMT</pubDate>
            <atom:updated>2026-06-15T20:14:04.188Z</atom:updated>
            <content:encoded><![CDATA[<p><em>A grad school project that connected my program management past to my product future.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3Q8oB9kIaOq1RO01o2Ftwg.png" /><figcaption>Pupuzzle Feeder Concept</figcaption></figure><p>I came into my graduate program at the University of Washington’s Human Centered Design and Engineering (HCDE) program with about six years of program management experience. I knew how to build roadmaps, align stakeholders, and keep complex projects on track. What I didn’t know was how naturally those skills would translate into product management.</p><p>That realization came during a solo class project where I spent 17 weeks developing a product concept from scratch: the JoyBrand Pupuzzle Feeder.</p><h3>Where the Idea Started</h3><p>This project started with my dog. She had CCL surgery on her knee, and for six weeks she couldn’t do any physical activity while she recovered. No walks, no fetch, no zoomies around the apartment. During that time, I leaned heavily on puzzle feeders to keep her mentally stimulated when her body couldn’t be.</p><p>That experience gave me a firsthand look at both the value of puzzle feeders and their biggest friction point: they require daily setup. You have to fill compartments, hide treats, and reset the whole thing every single day. When you’re already managing a post-surgery recovery routine, that extra effort adds up fast.</p><p>When it came time to brainstorm what I wanted to build for this class project, I kept coming back to problems I wanted to solve for my dog. And then, out of nowhere, the idea just appeared. I could see it so clearly: a volcano-shaped feeder, kibble pouring in at the top, tumbling down through a funnel, and scattering into little puzzle compartments for her to solve. It wasn’t something I sketched out or reasoned my way into. It just popped into my head as a fully formed image. That vivid mental picture became the Pupuzzle Feeder.</p><p>The core tension I wanted to address: simplifying the owner’s experience while maximizing the dog’s mental stimulation.</p><h3>The Concept</h3><p>The Pupuzzle Feeder is a puzzle-based feeding system built around a volcano-shaped design. At the top sits a funnel where you pour in your dog’s kibble. The food disperses down into multiple interactive puzzle compartments, each with different mechanisms like lifting flaps, sliding plates, and pressing parts. The dog has to push, pull, slide, and lift to access their food.</p><p>The key innovation is that the funnel does the distribution work for you. Instead of manually filling each compartment, you pour kibble in once and the feeder handles the rest. Mealtime becomes enrichment time without any extra effort from the owner.</p><p>I designed the V1.0 to be made from durable, pet-safe materials and to be dishwasher safe, because early survey research told me that cleanability was a non-negotiable for pet owners.</p><h3>Thinking in Phases</h3><p>One of the most valuable parts of this project was developing a three-year strategic product roadmap. Rather than trying to build the perfect product on day one, I planned a phased release strategy where each version had its own distinct business goals.</p><p><strong>V1.0: Market Entry.</strong> The first version focuses purely on core functionality. A reliable, well-designed puzzle feeder at $79, launched through e-commerce platforms like Etsy and Chewy. The goal here is simple: get into the market, make sales, and start collecting customer feedback. Small-batch production with small-scale suppliers keeps risk low.</p><p><strong>V2.0: Enhanced Design.</strong> The second version incorporates real customer feedback to refine the product. This means sturdier materials, easier cleaning, adjustable difficulty levels, and new options like different sizes and colors. V2.0 also expands distribution into retail stores like PetSmart. At this stage, the business shifts from market entry to market expansion.</p><p><strong>V3.0: Smart Integration.</strong> The third generation is where things get interesting. This version introduces a companion app for tracking meal times, engagement, and calorie intake. It adds an automatic feeder component and expands into new product lines like a travel-sized portable version. V3.0 is about competitive differentiation and cementing brand loyalty with customers who are willing to invest in premium features.</p><p>What I learned from this exercise is that phased roadmapping isn’t just about features. It’s about business strategy. Every decision I made about V1.0, from material choices to distribution channels, either enabled or constrained what was possible in V2.0 and beyond.</p><h3>AI as a Solo PM’s Best Friend</h3><p>One unexpected takeaway from this project was how much AI tools expanded what I could do on my own. I’m not a product designer or illustrator, but I needed to communicate what this feeder would actually look like. Using AI-generated sketches, I was able to create detailed, labeled product visuals that brought the concept to life in a way I never could have done by hand.</p><p>This mattered more than I expected. Having a clear visual of the product, with every component labeled and placed, helped me think through the design more carefully. It also made my final presentation significantly stronger. For solo PMs or anyone working without a dedicated design team, AI tools are a genuine force multiplier for product visualization and communication.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VcaBtEl8MzRBqoYCdhaTtA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dlr-Fxn9qAsdJlymsUpZdw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qOSVmCZ3Tl0SsmSQmFfVRg.png" /><figcaption>Various AI sketches of the concept</figcaption></figure><h3>The Program Management Connection</h3><p>Here’s what surprised me most about this project: how familiar it all felt.</p><p>Building a phased release strategy, balancing competing priorities, making data-informed decisions, thinking about stakeholder alignment, all of it drew directly on skills I developed during my years in program management. The frameworks were the same. The mindset was the same. The difference was the lens.</p><p>In my previous roles, I was optimizing internal processes and managing operational complexity. In product management, I’m applying those same skills to build solutions that directly impact people’s daily lives. It’s the same strategic thinking, but now with a user-centered perspective that makes the work feel more connected to real outcomes.</p><p>This project showed me that program management skills translate to product work. Strategic roadmapping, stakeholder research, and balancing priorities form the foundation of strong PM work. Now I’m applying those same skills through a user-centered lens to build solutions that directly impact lives.</p><h3>What I’d Do Differently</h3><p>If I were to revisit this project, I’d want to go deeper on user validation. While I conducted survey research that informed key design decisions like material choices and cleanability, I didn’t do formal usability testing with the product concept itself. In a real product development scenario, I’d want to put prototypes in front of dog owners early and often to test whether the funnel distribution mechanism actually works as intended, and whether the puzzle difficulty levels are calibrated correctly for different dog sizes and breeds.</p><p>I’d also want to explore the competitive landscape more thoroughly. The pet enrichment market is growing fast, and understanding where existing products fall short would sharpen the value proposition.</p><h3>The Bigger Picture</h3><p>This was a class project, and I want to be upfront about that. The Pupuzzle Feeder isn’t launching on Etsy next month. But the exercise of taking a product concept through a full development cycle, from problem identification to roadmapping to go-to-market strategy, was incredibly valuable.</p><p>It confirmed something I suspected when I started my HCDE journey: that my background in program management isn’t something I need to leave behind as I move into UX and product work. It’s an asset. The skills transfer. And when you add a human-centered design perspective on top of operational and strategic experience, the combination is powerful.</p><p>I’m excited to keep building on that foundation.</p><p><em>Savannah Buchanan is a graduate student at the University of Washington’s Human Centered Design and Engineering program, with a background in program management and psychology. She writes about the intersection of UX, product management, and career transitions.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Q74pK0CLhVuM_fQmY0tBuw.jpeg" /><figcaption>My baby, Joy, who inspired me</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ff7aa8c199d5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Journey Learning R: From Confusion to Confidence]]></title>
            <link>https://medium.com/@savbb/my-journey-learning-r-from-confusion-to-confidence-6a1294e58bb8?source=rss-4d79ab390a10------2</link>
            <guid isPermaLink="false">https://medium.com/p/6a1294e58bb8</guid>
            <category><![CDATA[r-programming]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[university-of-washington]]></category>
            <category><![CDATA[students]]></category>
            <category><![CDATA[ux]]></category>
            <dc:creator><![CDATA[Savannah]]></dc:creator>
            <pubDate>Thu, 28 May 2026 19:21:52 GMT</pubDate>
            <atom:updated>2026-05-28T19:21:52.946Z</atom:updated>
            <content:encoded><![CDATA[<h3><em>A student’s honest account of navigating data structures, visualization, and statistical programming</em></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4vKAvuEIKwrRgS5FEI0GBw.jpeg" /></figure><p><strong>Context:</strong> This is my journey learning R in an introductory programming course (CSSS508 — Introduction to R for Social Scientists). I came in with minimal programming experience and learned through weekly homework assignments, debugging sessions, and lots of trial and error.</p><p>When I first opened RStudio for my intro R course, I had no idea what I was getting into. The blinking cursor seemed to mock me as I stared at an empty script file. Fast forward several months, and I’ve gone from struggling to load packages to creating complex visualizations and understanding tidy evaluation.</p><p>This isn’t a story about becoming an R expert. It’s about the messy middle: the confusion, the small victories, the embarrassing mistakes I made along the way.</p><h3>The Beginning: “What Even Is a Package?”</h3><p>My first real obstacle came early. I could install the nycflights13 package in the R console just fine, but when I tried to use it in a Quarto document, everything broke. This seemingly simple issue taught me a fundamental lesson: R has different &quot;environments,&quot; and understanding where your code runs matters.</p><p>The solution was elegant once I understood it:</p><pre>#| label: setup<br>#| include: false</pre><pre>if (!require(&quot;nycflights13&quot;)) {<br>  install.packages(&quot;nycflights13&quot;)<br>}</pre><pre>library(nycflights13)</pre><p>This pattern of checking before installing became a cornerstone of my R workflow. But this was just the beginning.</p><h3>Wrestling with Data Structures</h3><p>The real learning began when I encountered R’s data structures: vectors, matrices, lists, and data frames. Each homework assignment felt like solving a puzzle where the pieces kept changing shape.</p><p>It’s a bit like learning math. You can’t really do arithmetic until you understand what numbers actually are: not just symbols on a page but representations of quantity that follow consistent rules. R is the same way. You can copy code all day long, but until you understand what a vector actually is, why a dataframe is structured the way it is, and how R thinks about types, nothing quite makes sense. You’re just pushing symbols around and hoping for the best.</p><h3>Vectors and Factors: The Building Blocks</h3><p>One assignment asked me to create a vector of the first 10 capital letters and a factor variable from the last 10 lowercase letters. Simple, right? Not when you misread “last 10” as “all 26”:</p><pre># What I did wrong:<br>vec_fac &lt;- factor(letters[1:26])</pre><pre># What I should have done:<br>vec_fac &lt;- factor(letters[17:26])  # letters q through z</pre><p>This mistake cascaded through the entire assignment. I kept creating new variables instead of reusing the ones I’d already defined, breaking the continuity the assignment was trying to teach. The feedback stung, but it drove home an important point: in programming, attention to detail isn’t pedantic. It’s essential.</p><h3>Matrices: When Everything Becomes Character</h3><p>Matrices taught me about R’s type coercion rules the hard way. I’d create a matrix with numbers, add more numbers, then add letters, and suddenly everything was a character string:</p><pre>matrix_mixed &lt;- matrix(NA, nrow = 10, ncol = 4)  # Logical (NA)<br>matrix_mixed[,1] &lt;- 1:10                          # Now numeric<br>matrix_mixed[,2] &lt;- rnorm(10)                     # Still numeric<br>matrix_mixed[,3:4] &lt;- cbind(vec_char, vec_fac)   # Everything becomes character!</pre><p>Why? Because matrices can only hold one data type, and character is the “lowest common denominator.” This forced me to understand R’s type hierarchy: logical, then integer, then numeric, then character. It’s a concept that seemed academic until I saw my carefully calculated numbers turn into strings.</p><h3>The Tidyverse Revolution</h3><p>Then came the tidyverse, and R suddenly made sense. Well, eventually.</p><h3>The Pipe: Making Code Readable</h3><p>The pipe operator (%&gt;% and later |&gt;) transformed my code from nested function hell to readable steps.</p><p><strong>Real example from a restaurant inspection dataset:</strong></p><pre># Before pipes - reading inside-out:<br>filter(mutate(restaurants, <br>  inspection_date = mdy(inspection_date)), <br>  grade &gt; 2)</pre><pre># After pipes - reading top-to-bottom:<br>restaurants |&gt;<br>  mutate(inspection_date = mdy(inspection_date)) |&gt;<br>  filter(grade &gt; 2)</pre><p>One homework assignment asked me to find the Seattle zip code with the worst average restaurant health inspection grades, then show the trend over time. With pipes, the workflow became crystal clear:</p><pre># Find worst zip code<br>worst_zip &lt;- restaurants |&gt;<br>  mutate(inspection_date = mdy(inspection_date)) |&gt;<br>  group_by(zip_code) |&gt;<br>  summarize(mean_grade = mean(grade, na.rm = TRUE)) |&gt;<br>  arrange(desc(mean_grade)) |&gt;<br>  slice(1) |&gt;<br>  pull(zip_code)</pre><pre># Show trend for that zip<br>restaurants |&gt;<br>  filter(zip_code == worst_zip) |&gt;<br>  mutate(year = year(inspection_date)) |&gt;<br>  group_by(year) |&gt;<br>  summarize(mean_grade = mean(grade, na.rm = TRUE))</pre><p>Reading left-to-right and top-to-bottom instead of inside-out changed everything. I started thinking in workflows rather than functions. Each |&gt; says &quot;and then,&quot; making code read almost like English: &quot;Take restaurants, and then convert dates, and then group by zip code, and then calculate means...&quot;</p><h3>ggplot2: Where Frustration Meets Beauty</h3><p>Data visualization with ggplot2 was where I experienced the most frustration and the most satisfaction. Creating my first scatterplot function taught me about tidy evaluation:</p><pre>scatter_plot &lt;- function(dataset, x, y) {<br>  ggplot(dataset, aes(x = {{x}}, y = {{y}})) +<br>    geom_point()<br>}</pre><p>Those curly braces {{}} seemed like magic. They let me pass column names without quotes, making my function work like the built-in tidyverse functions. This was when R started feeling less like a foreign language and more like a tool I could shape to my needs.</p><h3>The Mystery of the Missing Function</h3><p>One particular error message haunted me: “could not find function ‘mutate’.” I’d copy code examples that should work, but they didn’t. The solution? I hadn’t loaded the required packages:</p><pre>library(tidyverse)  # This loads dplyr, which includes mutate()</pre><p>This taught me that unlike some languages where standard functions are always available, R requires you to explicitly load packages. It’s modular by design, which means lighter memory footprint but a steeper learning curve for beginners.</p><h3>Mastering Iteration and Functional Programming</h3><p>The real turning point came when I started using across() and the purrr package for iteration. Instead of writing the same code over and over with slight variations, I could apply functions across multiple columns at once.</p><p>One homework assignment asked me to compute the number of unique values in each column of the <a href="https://allisonhorst.github.io/palmerpenguins/">Palmer Penguins dataset</a>. My first instinct was to do this:</p><pre># The tedious way (don&#39;t do this!)<br>n_distinct(penguins$species)<br>n_distinct(penguins$island)<br>n_distinct(penguins$bill_length_mm)<br># ... and so on for 8 columns</pre><p>But with across(), it became much cleaner:</p><pre># The elegant way<br>penguins |&gt; <br>  summarise(across(everything(), ~ n_distinct(.x, na.rm = TRUE)))</pre><pre># Output:<br># species: 3, island: 3, bill_length_mm: 164, bill_depth_mm: 80,<br># flipper_length_mm: 55, body_mass_g: 94, sex: 2, year: 3</pre><p>This single line counted unique values across all columns and handled missing data automatically. This was my introduction to functional programming: treating functions as things you can pass around and compose together.</p><p>The diamonds dataset taught me how to combine grouping with iteration:</p><pre># Group by multiple variables and calculate means<br>diamonds |&gt; <br>  summarise(<br>    n = n(),<br>    across(where(is.numeric), mean),<br>    .by = c(cut, clarity, color)<br>  )</pre><p>This groups diamonds by three categorical variables (cut, clarity, color), counts observations in each group, and calculates the mean of every numeric column. The where(is.numeric) part is particularly clever. It automatically picks only numeric columns, so you don&#39;t have to list them explicitly. If you add a new numeric column to your dataset later, this code still works without modification.</p><h3>Understanding the Pipeline</h3><p>One assignment asked me to explain this code:</p><pre>diamonds |&gt; <br>  split(diamonds$cut) |&gt;<br>  map(\(df) lm(price ~ carat, data = df)) |&gt; <br>  map(summary) |&gt; <br>  map_dbl(&quot;r.squared&quot;)</pre><pre># Output:<br>#      Fair      Good Very Good   Premium     Ideal <br># 0.7383940 0.8509539 0.8581622 0.8556336 0.8670887</pre><p>At first, this looked like gibberish. But breaking it down step by step actually helped me understand how data flows through transformations:</p><p>First, split(diamonds$cut) divides the diamonds dataset into 5 separate dataframes, one for each cut quality (Fair, Good, Very Good, Premium, Ideal). Then map(\(df) lm(price ~ carat, data = df)) fits a linear regression model for each cut quality, creating a line that predicts diamond price from carat weight. The next map(summary) extracts detailed statistics from each regression model. Finally, map_dbl(&quot;r.squared&quot;) pulls out just the R² value, which measures how well carat predicts price (ranging from 0 to 1).</p><p>The output tells us that for Ideal cut diamonds, carat weight explains 87% of price variation. Even for Fair cut diamonds, it explains 74%.</p><p>When I asked what a regression line actually was, the answer finally made sense: it’s just the straight line that best fits through a cloud of data points, showing the relationship between two variables. In this case, as diamonds get bigger (more carats), they get more expensive, and we can quantify exactly how strong that relationship is. This split-analyze-extract pattern became something I could apply to lots of different problems.</p><h3>The Visualization Challenge: Making It Personal</h3><p>Creating meaningful visualizations was perhaps the most rewarding part of learning R. The assignment that made everything click was when I got to explore the popularity of my own name, Savannah, over time using the <a href="https://github.com/hadley/babynames">babynames dataset</a>.</p><p>I wanted to see how the name’s popularity changed from 1880 to 2017, separated by gender, with a marker for the year I was born (1988) and highlights for the peak popularity years. Here’s the code that brought it all together:</p><pre>library(babynames)<br>library(ggplot2)<br>library(ggthemes)</pre><pre># Define custom colors<br>colors &lt;- c(&quot;#1f77b4&quot;, &quot;#ff7f0e&quot;, &quot;#2ca02c&quot;, &quot;#d62728&quot;, <br>            &quot;#9467bd&quot;, &quot;#8c564b&quot;, &quot;#e377c2&quot;, &quot;#7f7f7f&quot;, <br>            &quot;#bcbd22&quot;, &quot;#17becf&quot;)</pre><pre>Savannah_plot &lt;- babynames |&gt; <br>  filter(name == &quot;Savannah&quot;) |&gt; <br>  mutate(sex2 = if_else(sex == &quot;F&quot;, &quot;Female&quot;, &quot;Male&quot;)) |&gt;<br>  ggplot(aes(x = year, y = prop, group = name, fill = name)) +<br>  geom_density(stat = &quot;identity&quot;, alpha = 0.25, color = colors[1]) + <br>  # Mark my birth year<br>  geom_vline(xintercept = 1988, color = colors[2], linetype = 2) +<br>  # Mark peak popularity years<br>  geom_vline(data = babynames |&gt;<br>                filter(name == &quot;Savannah&quot;) |&gt;<br>                mutate(sex2 = if_else(sex == &quot;F&quot;, &quot;Female&quot;, &quot;Male&quot;)) |&gt;<br>                slice_max(prop, by = sex2),<br>             aes(xintercept = year), color = colors[3]) +<br>  facet_grid(sex2 ~ ., scales = &quot;free_y&quot;) +<br>  scale_fill_manual(values = colors[1]) +<br>  labs(title = &#39;Popularity of the name &quot;Savannah&quot;&#39;,<br>       subtitle = &quot;1880-2017, by binary sex category&quot;,<br>       y = &quot;Proportion of babies with this name&quot;,<br>       x = &quot;Year&quot;) +<br>  theme_tufte(base_size = 16) + <br>  theme(legend.position = &quot;none&quot;, <br>        strip.background = element_rect(color = &quot;black&quot;,<br>                                      fill = alpha(colors[10], 0.5),<br>                                      linetype = 0))</pre><p>The name “Savannah” was virtually non-existent before the 1970s, then exploded in popularity through the 1980s and 90s. The peak for females came around the early 2000s, meaning I was born right as the name was gaining momentum. The dashed orange line at 1988 shows my birth year, nestled in that upward trend.</p><p>The funny thing is, I initially couldn’t get the plot to render at all. I kept getting the error “could not find function ‘mutate’.” After some frustrating debugging, I realized I hadn’t loaded the tidyverse package. Once I added library(tidyverse) at the top, everything worked.</p><p>This visualization made data feel personal. It wasn’t just about learning syntax. It was about seeing my own story reflected in 140 years of naming data. That’s when I understood why people get excited about data visualization. It’s not about making pretty charts; it’s about making abstract information concrete and meaningful.</p><h3>Common Pitfalls and Hard-Won Lessons</h3><p>Looking back at my homework assignments, I can see patterns in the mistakes I made. Here are the ones that cost me the most points and the most time.</p><h3>1. Reading the Instructions Carefully</h3><p>My biggest mistakes came from not reading assignment instructions carefully. Creating new variables when I should have reused existing ones, using 26 letters when only 10 were requested. Those errors taught me that in programming, assumptions are dangerous.</p><p><strong>Example mistake:</strong></p><pre># Assignment said: &quot;Use vec_fac from Question 1&quot;<br># What I did: Created a brand new vec_fac<br>vec_fac &lt;- factor(c(&quot;low&quot;, &quot;medium&quot;, &quot;high&quot;))  # Wrong!</pre><pre># What I should have done: Used the existing one<br># (the factor I created earlier with letters q-z)</pre><h3>2. Understanding Data Types</h3><p>R’s automatic type coercion can be helpful or harmful. Learning when R converts types and how to check types (typeof(), class()) saved me countless hours of debugging.</p><p><strong>The hierarchy to remember:</strong> logical, then integer, then numeric, then character</p><p>R always coerces “up” this hierarchy. Mix numbers and text in a matrix? Everything becomes text.</p><h3>3. Package Loading</h3><p>Always load your packages at the start of your script. This seems obvious now, but early on I’d scatter library() calls throughout my code, leading to confusion about what was loaded when.</p><p><strong>Best practice:</strong></p><pre># At the very top of your script:<br>library(tidyverse)<br>library(lubridate)<br>library(palmerpenguins)</pre><pre># Now all your code below has access to these functions</pre><h3>4. The echo: true Saga</h3><p>In Quarto documents, chunk options matter. Learning to use message: false and warning: false to suppress package loading messages made my rendered documents much cleaner:</p><pre>---<br>title: &quot;My Analysis&quot;<br>execute:<br>  echo: true       # Show the code<br>  message: false   # Hide package loading messages<br>  warning: false   # Hide warnings<br>---</pre><h3>5. Handling Missing Data</h3><p>The na.rm = TRUE parameter became my best friend. R&#39;s handling of missing values is strict. One NA can ruin an entire calculation. Being explicit about handling missing data makes code more robust.</p><pre>mean(c(1, 2, 3, NA))              # Returns NA<br>mean(c(1, 2, 3, NA), na.rm = TRUE) # Returns 2</pre><h3>Tools and Resources That Helped</h3><h3>Essential Packages</h3><ul><li><a href="https://www.tidyverse.org/"><strong>tidyverse</strong></a>: The meta-package that includes dplyr, ggplot2, tidyr, and more</li><li><a href="https://lubridate.tidyverse.org/"><strong>lubridate</strong></a>: For working with dates (because date formats are a nightmare)</li><li><a href="https://allisonhorst.github.io/palmerpenguins/"><strong>palmerpenguins</strong></a>: A fantastic practice dataset (better than iris!)</li></ul><h3>Key Learning Resources</h3><ul><li><a href="https://r4ds.hadley.nz/"><strong>R for Data Science</strong></a>: The bible of modern R programming (free online!)</li><li><a href="https://posit.co/resources/cheatsheets/"><strong>RStudio Cheatsheets</strong></a>: Visual guides for dplyr, ggplot2, and more</li><li><a href="https://stackoverflow.com/questions/tagged/r"><strong>Stack Overflow</strong></a>: Where I found answers to 90% of my errors</li><li><a href="https://www.r-bloggers.com/"><strong>R-bloggers</strong></a>: Daily articles about R from the community</li><li><a href="https://github.com/rfordatascience/tidytuesday"><strong>Tidy Tuesday</strong></a>: Weekly data visualization challenges</li></ul><h3>Key Concepts to Master</h3><ol><li><strong>The pipe operator</strong> (|&gt; or %&gt;%): Makes code readable</li><li><strong>Tidy evaluation</strong>: Understanding {{}} for writing functions</li><li><strong>across()</strong>: For applying functions to multiple columns</li><li><strong>map() functions</strong>: For iteration in functional style</li><li><strong>ggplot2 layering</strong>: Building plots piece by piece</li></ol><h3>What I Wish I’d Known Earlier</h3><p>R is a language, not just a tool. It has grammar, idioms, and multiple ways to say the same thing. Once I learned the tidyverse dialect, everything made more sense. Base R and tidyverse R can look like completely different languages sometimes.</p><p>Errors are genuinely useful. Every “could not find function” or “object not found” error taught me something about how R’s environment and scoping rules work. I stopped seeing them as failures and started seeing them as feedback.</p><p>The REPL (the R console) is your best friend for learning. Running code line-by-line before putting it in a script saves so much time and helps you understand what each piece actually does.</p><p>The documentation is better than I initially thought. The ?function_name help system and package vignettes are actually helpful once you learn how to read them. They&#39;re dense, but they&#39;re accurate.</p><p>Community matters more than I expected. Stack Overflow, R-bloggers, and course forums were lifesavers. I learned as much from reading other people’s questions as I did from the course materials.</p><h3>The Breakthrough Moment</h3><p>There wasn’t one single moment when R “clicked.” Instead, it was gradual, and honestly frustrating because I kept waiting for that lightbulb moment that never came.</p><p>In the first couple weeks, I was completely lost. I’d stare at error messages and have no idea where to even start troubleshooting. By week three or four, I at least understood what vectors and matrices were, even if I couldn’t use them correctly. Around week seven, something shifted. I started recognizing patterns in the code. The pipe operator started to make sense. I could read a ggplot call and mentally picture what the output would look like.</p><p>By the end of the course, I was writing custom functions and didn’t need to constantly reference the documentation. More importantly, when something broke, I had strategies for fixing it rather than just panicking.</p><p>The real breakthrough was when I stopped seeing R as a series of commands to memorize and started seeing it as a way of thinking about data:</p><ul><li>Data flows through transformations (that’s what the pipe is for)</li><li>Variables have types and structures (and R is strict about them)</li><li>Functions are composable (you can chain them together)</li><li>Visualization tells stories (numbers alone rarely convince anyone)</li></ul><p>These principles, once internalized, made everything else fall into place. When I successfully created the Savannah name popularity visualization, which combined data wrangling, date manipulation, grouping, and layered plotting. I knew I’d crossed a threshold. I wasn’t just following tutorials anymore; I was solving real problems.</p><h3>Looking Forward</h3><p>I’m not an R expert by any stretch. But I can now load and clean datasets without constantly googling syntax, create visualizations that look professional enough to share, write custom functions using tidy evaluation, use iteration to avoid repetitive code, and debug errors systematically instead of randomly changing things until something works.</p><p>More importantly, I’ve learned how to learn. When I run into a new R challenge, I know where to look, what to search for, and how to break down problems into pieces I can actually solve.</p><h3>Advice for Future R Learners</h3><p>Start small. Don’t try to learn everything at once. Get comfortable with vectors before worrying about matrices. Master single operations before trying to chain them together with pipes. Learn basic ggplot before attempting complex visualizations with multiple layers.</p><p>Embrace the errors. Every error message is teaching you something about how R works. Read them carefully, Google them, try to understand what actually went wrong rather than just finding a quick fix.</p><p>Type the code yourself instead of copy-pasting examples. It feels slower, but typing forces you to notice details and builds muscle memory. Plus, you’ll catch typos before running the code.</p><p>Work with data you actually care about. Using datasets that interest you (like my name popularity data) makes learning feel less like homework and more like exploration.</p><p>Ask for help when you’re stuck. The R community is surprisingly welcoming. Don’t waste hours struggling alone when someone else has likely solved your exact problem and posted about it.</p><p>Be patient with yourself. Learning R is genuinely hard. It requires understanding statistics, programming, and data manipulation all at once. Give yourself some grace when things don’t click immediately. They didn’t for me either.</p><h3>Conclusion</h3><p>Learning R changed how I think about data. It’s not just about running analyses. It’s about understanding how data is structured, building workflows that other people can follow, and turning numbers into visuals that actually communicate something.</p><p>The journey from “how do I install a package?” to creating complex data pipelines wasn’t linear. There were plenty of frustrations, late nights debugging, and moments where I questioned whether I’d ever understand this language. But each small victory made it worthwhile.</p><p>After one course, I completed 9 homework assignments (with varying degrees of success), debugged countless errors, and created dozens of visualizations. More importantly, I had a shift in mindset from thinking of code as instructions to thinking of it as a way to communicate with data.</p><p>R isn’t easy, but it’s worth it. If someone who struggled with basic package installation can eventually write custom functions and wrangle complex datasets, you can too.</p><h3>Ready to Start Your R Journey?</h3><p>If you’re thinking about learning R, here’s what I’d recommend for your first week:</p><ol><li>Install <a href="https://cran.r-project.org/">R</a> and <a href="https://posit.co/download/rstudio-desktop/">RStudio</a></li><li>Work through Chapter 1 of <a href="https://r4ds.hadley.nz/">R for Data Science</a></li><li>Load your first dataset with data(mtcars) and run summary(mtcars)</li><li>Join the <a href="https://community.rstudio.com/">RStudio Community</a> forum for when you get stuck</li></ol><p><strong>Tags:</strong> #RStats #DataScience #LearningToCode #DataVisualization #Statistics #RStudio #Tidyverse</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6a1294e58bb8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When Your First Visualization Fails: Lessons from Exploring 2,600 Languages]]></title>
            <link>https://medium.com/design-bootcamp/when-your-first-visualization-fails-lessons-from-exploring-2-600-languages-4eec9c5ca7d3?source=rss-4d79ab390a10------2</link>
            <guid isPermaLink="false">https://medium.com/p/4eec9c5ca7d3</guid>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[tableau]]></category>
            <category><![CDATA[user-experience]]></category>
            <category><![CDATA[information-visualization]]></category>
            <category><![CDATA[ux]]></category>
            <dc:creator><![CDATA[Savannah]]></dc:creator>
            <pubDate>Wed, 21 Jan 2026 01:30:01 GMT</pubDate>
            <atom:updated>2026-01-23T09:32:34.030Z</atom:updated>
            <content:encoded><![CDATA[<iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fpublic.tableau.com%2Fapp%2Fprofile%2Fsavannah.buchanan%2Fviz%2FWALS_Dataset_3%2FTheStory%3Fpublish%3Dyes&amp;type=text%2Fhtml&amp;schema=tableau&amp;display_name=Tableau&amp;src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fpublic.tableau.com%2Fviews%2FWALS_Dataset_3%2FTheStory%3Fpublish%3Dyes" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/94b1ec52c1b09f489ca3979074a7e4fa/href">https://medium.com/media/94b1ec52c1b09f489ca3979074a7e4fa/href</a></iframe><p>I started my information visualization project with what seemed like a straightforward question: What are the dominant word order patterns across the world’s languages?</p><h3>The Problem with Perfect Charts</h3><p>My initial visualizations were technically perfect. Clean bar charts showing SOV (Subject-Object-Verb) and SVO (Subject-Verb-Object) word orders dominating globally. Neat frequency distributions by language family. Everything properly labeled, color-coded, and easy to read.</p><p>They were also completely useless.</p><p>The problem wasn’t the execution. It was the question. I was asking “what is most common?” when I should have been asking “what is <em>interesting</em>?” As Munzner describes in <em>Visualization Analysis &amp; Design</em>, choosing the right task abstraction is fundamental. My visualizations were answering the wrong task entirely.</p><p>The data was screaming the linguistic equivalent of “water is wet.” Yes, most languages follow SOV or SVO order. This is well-established in linguistics. My beautiful charts were just visualizing what everyone already knew.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wAn0h-1mfQbXGMpV8ol7EQ.png" /><figcaption>Visualization of documented languages and their word orders</figcaption></figure><h3>Shifting Focus</h3><p>Staring at my seventh iteration of essentially the same bar chart, I noticed something in my exploratory heatmap: the Papunesia macroarea (covering Papua New Guinea, Indonesia, and the Pacific islands) had an unusually diverse distribution of word orders. Unlike other regions that showed clear dominance patterns, Papunesia had meaningful representation across almost every category.</p><p>This was the moment my project actually began.</p><p>I shifted my entire analytical frame:</p><ul><li>Old task: “Present known patterns” vs. New task: “Discover anomalies”</li><li>Old scope: Global distributions vs. New scope: Regional deep dive</li><li>Old question: “What’s normal?” vs. New question: “What breaks the rules?”</li></ul><p>This pivot required more than just filtering the data differently. It meant rethinking what the visualization was <em>for</em>. I was no longer creating a reference chart. I was building an investigative tool.</p><h3>Redefining Outliers</h3><p>Once I committed to focusing on outliers, I hit an immediate technical barrier: how do you define “outlier” in a way that’s both meaningful and implementable?</p><p>My first instinct was to flag languages whose word order diverged from their language family’s dominant pattern. This would have been elegant, showing which languages were syntactically unusual <em>relative to their linguistic neighbors</em>.</p><p>Tableau said no.</p><p>The tool doesn’t support dynamic mode calculations, and implementing this comparison was beyond my technical skill level at the time. This is where tool limitations force creative compromises. I couldn’t compute what I wanted, so I had to reframe the question entirely.</p><p>Instead, I defined outliers simply: the rarest word orders in Papunesia. Specifically OSV, OVS, VOS, and “No dominant order.” This was less sophisticated analytically, but it had a crucial advantage: it was visually intuitive. Users didn’t need to understand what “deviation from family mode” meant. They could see immediately that these word orders appeared in only 1–9 languages each, compared to 145+ for the common orders.</p><p>Sometimes the best visualization isn’t the most complex analysis. It’s the clearest story.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7AHk4wn1zEwUkkYaojR4kA.png" /><figcaption>Walking the user through filtering for least common word order</figcaption></figure><h3>User Testing</h3><p>I thought my visualization was pretty clear until I watched two classmates try to use it.</p><p><strong>Test Task 1</strong>: “Find the language with the least common word order in Papunesia.”</p><p>Both participants succeeded. They identified “6 OSV” as the rarest. But the process revealed problems I hadn’t noticed:</p><ul><li>One participant was confused by my numerical labels (“4–7” for word order types). What seemed like clean categorical coding to me looked like arbitrary numbering to them.</li><li>Another jumped straight to the end of my Tableau Story, expecting interactive filtering that didn’t exist.</li><li>The “81A” prefix in my field names (inherited from the WALS dataset) was pure visual clutter to anyone not familiar with linguistic feature coding.</li></ul><p><strong>Test Task 2</strong>: “Use the map to locate where the rarest word orders appear. What do you notice about their geographic locations?”</p><p>This is where things got worse. One user didn’t even see the full instructions because they were hidden below the scroll line in my story panel. The other wanted quantitative feedback. They kept asking “How many is this?” when hovering over map points, wanting to understand just how rare these patterns actually were.</p><p>These were simple, fixable problems. But they taught me something crucial: <strong>as a designer, you’re the worst person to evaluate your own work</strong>. I had spent weeks with this data. The “81A” prefix was invisible to me. The scroll requirement seemed obvious. The rarity of certain categories was internalized knowledge.</p><p>My users had none of that context.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ONyOc4xnZRJYZ6_NJtuGrA.png" /><figcaption>Here is where they had the opportunity to filter for themselves if they wanted</figcaption></figure><h3>Small Changes, Big Impact</h3><p>The revisions I made in response to user testing were almost embarrassingly simple:</p><ol><li><strong>Removed “81A” from all field labels</strong> (Reduced cognitive clutter)</li><li><strong>Resized story panels to eliminate scrolling</strong> (Made instructions visible)</li><li><strong>Changed layout from “Fixed” to “Automatic” sizing</strong></li><li><strong>Added a static text box listing exact word order counts</strong> (Gave users a reference for “rare”)</li><li><strong>Reworded instructions to define rarity as “bottom 3–4 word orders”</strong> (Helped users focus on meaningful subsets)</li></ol><p>None of these changes altered the underlying analysis. They didn’t make new insights appear. But they transformed the <em>accessibility</em> of those insights. This is the difference between a visualization that works in theory and one that works in practice.</p><h3>Story vs. Dashboard</h3><p>One of the most interesting design choices I made was using Tableau’s Story feature instead of creating an interactive dashboard. This decision shaped the entire user experience.</p><p>A dashboard says: “Here’s the data. Explore it yourself.”</p><p>A story says: “Let me show you what I found.”</p><p>For this project, I needed the latter. I wanted to walk users through my own process of discovery:</p><ol><li><strong>Overview</strong>: Global distribution of word orders (establishing baseline)</li><li><strong>Zoom</strong>: Heatmap showing Papunesia’s unusual diversity</li><li><strong>Filter</strong>: Table of word order frequencies in Papunesia</li><li><strong>Focus</strong>: Unfiltered map of the region (setting up the reveal)</li><li><strong>Insight</strong>: Filtered map showing only rare word orders clustered in isolated coastal/island areas</li></ol><p>This sequence follows Shneiderman’s mantra of “overview first, zoom and filter, then details on demand,” but with a deliberate narrative progression. Each view built on the previous one, gradually narrowing focus until the pattern became visible.</p><p>The tradeoff? Less interactivity. Users couldn’t freely explore or test their own hypotheses. But they got something arguably more valuable: a guided tour that made the central insight almost impossible to miss.</p><h3>What I Learned</h3><p>This project forced me to confront several fundamental principles from Munzner’s framework:</p><h3>1. Idiom Must Match Task</h3><p>My early bar charts were perfectly encoded (position on a common scale, clear categorical grouping). But they were solving a “lookup” task when I needed a “discover anomalies” task. The idiom was technically correct but conceptually wrong.</p><h3>2. Expressiveness Isn’t Everything</h3><p>The matrix heatmap showing word orders across macroareas used color hue and presence/absence rather than precise quantitative encoding. It was less “expressive” in the formal sense (you couldn’t read exact values). But it made the pattern (Papunesia’s diversity) immediately visible. Sometimes approximate visibility beats precise invisibility.</p><h3>3. Tool Constraints Shape Design</h3><p>I had to work around Tableau’s inability to do dynamic frequency filtering. This forced me to use static text annotations and simplified definitions of rarity. These weren’t my first choices, but they led to a clearer narrative. Constraints can be creative catalysts.</p><h3>4. Consumption vs. Presentation Matters</h3><p>I wasn’t building an exploratory tool for linguists to use in their research. I was presenting a specific finding to a general audience. That fundamentally changed how I structured the information, how much control I gave users, and how much scaffolding I provided.</p><h3>The Finding</h3><p>Here’s what’s funny: I spent most of this article talking about visualization design, and barely mentioned the actual finding.</p><p>The final visualization revealed that rare syntactic structures in Papunesia (OSV, OVS, VOS word orders) appear disproportionately in geographically peripheral areas: remote coastlines, isolated islands, and archipelagos. The hypothesis this suggests is that geographic isolation may contribute to syntactic divergence.</p><p>It’s a tentative finding that would need much more rigorous testing. You’d want to control for population density, language contact patterns, colonization history, and topography. You’d want to test if the pattern holds in other macroareas. You’d want actual statistical validation.</p><p>But here’s the thing: I would never have seen this pattern without the visualization.</p><p>Looking at the raw data table, or even at summary statistics, this geographic clustering isn’t obvious. It emerged through the process of visual encoding, specifically through the spatial position of points on a map, filtered by a categorical attribute.</p><p>This is what visualization does. It makes patterns visible that would otherwise remain hidden in the data.</p><h3>Looking Back</h3><p>If I were starting this project over, knowing what I know now:</p><p><strong>I’d fail faster.</strong> I spent too long polishing my initial global visualizations before admitting they weren’t working. The sooner you can recognize that a visualization isn’t serving its purpose, the sooner you can pivot.</p><p><strong>I’d test earlier.</strong> User testing revealed fixable problems that I could have caught weeks earlier. Even informal “can you tell me what you see here?” sessions with classmates would have helped.</p><p><strong>I’d embrace tool limitations sooner.</strong> I wasted time fighting Tableau’s constraints instead of working with them. The workarounds I eventually found (static text boxes, simplified rarity definitions) weren’t ideal, but they worked. Sometimes good enough is actually good enough.</p><p><strong>I’d think about the story arc from the beginning.</strong> I created individual visualizations first and assembled them into a narrative later. Starting with “what’s the story I want to tell?” would have given me better direction for which views to create.</p><h3>Final Thoughts</h3><p>Information visualization courses often focus on technical skills: which chart type to use, how to encode data, when to use color. These are important. But the deeper lesson (the one that only emerges from doing an actual project) is about design thinking.</p><p>You have to be willing to throw away work that isn’t serving its purpose, even if it’s technically correct. You have to watch real users struggle with your design and resist the urge to defend it. You have to work within tool constraints creatively rather than fighting them stubbornly. And you have to remember that the goal isn’t to make a beautiful chart. It’s to make insight visible.</p><p>My project started with a simple question about word order patterns. It ended with a tentative hypothesis about geographic isolation and linguistic diversity. But what I actually learned was how to think like a visualization designer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NDZyzOaeeqiY8z9PoYvHGQ.png" /><figcaption>Final page of my Tableau Story showing the least common word orders in this Macroarea</figcaption></figure><h4><em>The full interactive visualization is available on </em><a href="https://public.tableau.com/app/profile/savannah.buchanan/viz/WALS_Dataset_3/TheStory?publish=yes"><em>Tableau Public</em></a><em>.</em></h4><h4><em>The dataset used is from the World Atlas of Language Structures (WALS).</em></h4><p><strong>References:</strong></p><ul><li>Munzner, T. (2014). <em>Visualization Analysis &amp; Design</em>. CRC Press.</li><li>Heer, J., Bostock, M., &amp; Ogievetsky, V. (2010). A tour through the visualization zoo. <em>ACM Queue, 8</em>(5), 20–30.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4eec9c5ca7d3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/design-bootcamp/when-your-first-visualization-fails-lessons-from-exploring-2-600-languages-4eec9c5ca7d3">When Your First Visualization Fails: Lessons from Exploring 2,600 Languages</a> was originally published in <a href="https://medium.com/design-bootcamp">Bootcamp</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Rethinking Third Places Around Link Light Rail Stations]]></title>
            <link>https://medium.com/@savbb/rethinking-third-places-around-link-light-rail-stations-da00dd67df73?source=rss-4d79ab390a10------2</link>
            <guid isPermaLink="false">https://medium.com/p/da00dd67df73</guid>
            <category><![CDATA[university-of-washington]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[human-centered-design]]></category>
            <category><![CDATA[user-experience]]></category>
            <category><![CDATA[urban-design]]></category>
            <dc:creator><![CDATA[Savannah]]></dc:creator>
            <pubDate>Wed, 14 May 2025 21:27:16 GMT</pubDate>
            <atom:updated>2025-06-10T00:47:20.119Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Course Project for HCDE 518 @ University of Washington; Autumn 2024</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3eGqFrqhy0FN4nuM.gif" /></figure><p>Photo credit: Gail Wong, Urban Sketches Seattle</p><h3>Introduction</h3><p>Coined by sociologist Ray Oldenburg in 1991, the term <strong>third place </strong>refers to an informal public gathering space outside of home and work that fosters belonging and community connection¹. There has been a recent decline in third places due to “economic, social, behavioral, technological, and policy changes”, negatively impacting mental health, community belonging, and social equity²𝄒³.</p><p>Throughout this 9-week course project, we explored revitalizing third places in different communities. We found that Seattle’s rapid urban development, particularly around its growing light rail system, offered a unique opportunity to integrate new third places near transit hubs. Moving forward, we focused our project around the question: <em>How can we improve third places around Link light rail stations in Seattle?</em></p><h3>Our Process</h3><p>In our project, we used a design-thinking methodology. Roughly, the process we followed was <strong>Empathize </strong>→ <strong>Define</strong> → <strong>Ideate </strong>→ <strong>Prototype </strong>→ <strong>Test</strong>. Implementing this was a non-linear and iterative process, where several stages were repeated.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jgc2fncpmwZjM0pt.jpeg" /></figure><p>A visual representation of our design process</p><h3>Research</h3><p>Through our research, we wanted to understand individual motivations behind Link light rail usage and attitudes towards existing nearby third places in the Greater Seattle area. We conducted secondary research, rapid ethnographies, and a web-based survey. The questions we explored were:</p><ol><li>What types of spaces do Link riders visit when traveling via the light rail?</li><li>What kinds of spaces do Link riders want near light rail stations?</li><li>What improvements could make spaces near light rail stations more inclusive for all Link riders?</li></ol><h3>Secondary Research</h3><p>We reviewed over 15 sources of existing literature and research surrounding third places and adjacent topics such as community psychology, urban planning, global perspectives, inclusivity, and anti-racism.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YjqEnBxafu9KmhI3.png" /></figure><p>Map of different topics reviewed and their interconnectedness</p><h3>Rapid Ethnography</h3><p>We conducted rapid ethnographies at several Link Light Rail stations, including Columbia City Station and U District Station. By immersing ourselves in the environment, we could better observe rider behaviors, available amenities, and station accessibility.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kspOvCjj4qBk-p55.png" /></figure><p>Left: Columbia City Station, Right: U District Station</p><h3>Survey</h3><p>We recruited survey respondents by putting up fliers near several Link light rail stations in the Greater Seattle Area. The survey was also shared online on various social media platforms and through student networks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HCR-BbZMBy4R4yUD.png" /></figure><p>Left: Survey fliers put up near link light rail stations, Right: Web-based survey outline</p><h3>Research Insights:</h3><p>According to our secondary research, third places:</p><ul><li>Foster social interaction, community belonging, quality of life, inclusivity, and overall well-being</li><li>Are critical to public health, providing environments that enhance resilience against stress and loneliness⁴</li></ul><p>Through our rapid ethnography, we discovered that stations lacked:</p><ul><li>Amenities (restrooms, trash cans, Wi-Fi)</li><li>Seating, adequate shelter from the elements</li></ul><p>Our survey insights were:</p><ul><li><strong>50%</strong> of survey respondents were from Columbia City Station</li><li><strong>84%</strong> reported wanting more community spaces near light rail stations (parks, playgrounds, community centers, and co-working spaces)</li><li>Respondents <strong>disliked the lack</strong> of seating, bathrooms, and available community spaces</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*mQT07rPnSjwk7Bqd.png" /></figure><p>Our research insights by category</p><p>These insights guided our design requirements and ideation, narrowing our scope to designing a third place for Columbia City Station with an emphasis on <strong>community engagement </strong>and <strong>public amenities</strong>.</p><h3>Ideation</h3><p>To kick off ideation, we identified the following as out of scope:</p><ul><li>Detailed construction plans and city codes</li><li>City-wide development or large-scale infrastructure changes</li><li>Funding and policy implementation</li></ul><h3>Phase 1: Generating Ideas</h3><p>In the first phase of ideation, we brainstormed various concepts and ideas that incorporate the needs of Link riders into a community space. We sketched a wide range of possibilities, prioritizing inclusivity and utility.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*e8B-kINoh8rEqWkl.png" /></figure><p>Our early sketches (including seating, garden features, art installations, potential parks and cafes, and an app for riders)</p><h3>Phase 2: Applying Ideas</h3><p>For the second phase of ideation, we honed in on practical ways of applying our ideas to an empty plot of land adjacent to the Columbia City Station.</p><p>Our final sketches focused on two key concepts: a passenger cafe and a community garden, each addressing unique aspects of community engagement and Link rider needs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qBzVAsZ9sB21WiKf.png" /></figure><p>Left: Empty plot of land highlighted in pink, Right: Our final sketches selected for prototype development</p><p>Through feedback and reflection, we found these concepts to complement each other and combined them into a unified solution for our prototype: the Community Garden Café, designed to provide a welcoming, inclusive space with accessible amenities for both Link riders and the surrounding community.</p><h3>Design Goals:</h3><p>Before beginning the prototyping process, we defined our design goals based on insights from our user research and constraints of the physical space.</p><p>Our design goals were organized into three main categories:</p><ul><li><strong>Accessibility and Convenience</strong>: Entrances, walking paths, and seating areas must be easily accessible and ADA compliant. Design should include flexible seating options, both indoor and outdoor.</li><li><strong>Safety and Comfort</strong>: Environment must be clean, well-lit, and actively monitored to ensure safety and willingness to spend time in the area.</li><li><strong>Space Design and Flow</strong>: Area must include designated spaces that support Link rider needs, including amenities for eating, drinking, bathrooms, and community activities. Design should optimize flow of people and reduce congestion.</li></ul><h3>User Flows</h3><p>We mapped out several user flows to better understand how visitors would interact with the Community Garden Café. Guided by our user research and final sketches, these flows informed decisions about the physical layout and amenities, ensuring design goals were met while minimizing friction points.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZXScsD_ANKn8gF9A.png" /></figure><p>User Flow used for our storyboard prototype</p><h3>Prototype</h3><p>Due to time constraints and limitations of prototyping for a physical space, our team created an interactive storyboard that would visually represent the interaction and experience of visiting the Community Garden Café.</p><p>In addition to the physical space, we expanded our prototype to include screens for an accompanying “Explore My Station” website. This was influenced by our goal of providing users with easily accessible information around station amenities and nearby community spaces.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*--n3XgHewSfr_dxF.png" /></figure><p>Medium fidelity prototypes used for usability testing; Left: Website screens, Right: Several of the storyboard screens created</p><h3>Usability Testing</h3><p>We conducted usability testing with three Link riders. We sought feedback on the functionality and experience of visiting the Community Garden Café and the navigation of the accompanying website.</p><p>During testing, participants navigated the storyboard scenario and made choices based on how they would engage with the physical space in real life. They talked us through their exploration of the website and shared their thought process.</p><p>Our main takeaways from usability testing that were incorporated in our final design were:</p><ul><li>Preference for water fountain (to cover nearby road noise), greenery, cleanliness, and covered outdoor seating</li><li>Preference for website over app (due to ease of use) and desire for website to be backed by city or transit authorities for reliability</li></ul><h3>Final Design: Community Garden Café</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5nFp9IorL5CXoxGN.png" /></figure><p>Left: Proposed site plan for empty plot of land near Columbia City Station, Right: 3D rendering of proposed site plan</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*O6NwkeW8heMEE7N7.png" /></figure><p>Left: Proposed floor plans for cafe interior (top and bottom level), Right: 3D Rendering of proposed floor plans</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6DzMK5Fu02Zxta7k.png" /></figure><p>3D rendering of proposed cafe design — certain features (railings, automatic doors) were not included due to software limitations</p><h3>Final Design: Explore Link Light Rail Stations</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PdtxnG4dKCdjtdhU.png" /></figure><p>Proposed design for “Explore Link Light Rail Stations” website backed by Sound Transit</p><h3>Conclusion</h3><p>The Community Garden Café represents more than just a physical space — it’s a vision for fostering inclusivity, accessibility, and connection within urban environments.</p><p>Our design combines physical and digital approaches to transform Columbia City Station into a thriving community hub where Link riders and local residents can relax, connect, and engage with their surroundings. We hope this solution inspires similar initiatives to create sustainable third places for all.</p><h3>References</h3><ol><li>Project for Public Spaces. (2008, Dec 31). <em>Ray Oldenburg</em>. Project for Public Spaces. <a href="https://www.pps.org/article/roldenburg">https://www.pps.org/article/roldenburg</a></li><li>Steuteville, R. (2024, July 3). <em>Vanishing third places and what can be done</em>. Congress for the New Urbanism. <a href="https://www.cnu.org/publicsquare/2024/07/03/vanishing-third-places-and-what-can-be-done">https://www.cnu.org/publicsquare/2024/07/03/vanishing-third-places-and-what-can-be-done</a></li><li>Wolfe, C. (2023, June 21). <em>From vacant storefronts to vibrant hubs: Revisiting ‘third places’ for urban resilience</em>. GeekWire. <a href="https://www.geekwire.com/2023/from-vacant-storefronts-to-vibrant-hubs-revisiting-third-places-for-urban-resilience/">https://www.geekwire.com/2023/from-vacant-storefronts-to-vibrant-hubs-revisiting-third-places-for-urban-resilience/</a></li><li>Finlay, J., Esposito, M., Kim, MH., Gomez-Lopez, I., Clarke, P. (2019, Nov). <em>Closure of ‘Third Places’? Exploring Potential Consequences for Collective Health and Wellbeing</em>. National Library of Medicine. <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6934089/">https://pmc.ncbi.nlm.nih.gov/articles/PMC6934089/</a></li></ol><h3>Thank You!</h3><p>If you are interested in learning more about our work in <em>Rethinking Third Places around Link Light Rail Stations</em>, please leave us a comment or connect directly through <a href="http://savannahbuchanan96@gmail.com">email</a>.</p><blockquote><strong><em>University of Washington Human Centered Design and Engineering</em></strong><em><br>HCDE 518 User Centered Design, Autumn 2024<br>Team: </em><a href="http://www.linkedin.com/in/haneenelhaj"><em>Haneen El-haj</em></a><em>, </em><a href="http://www.linkedin.com/in/shanna-king"><em>Shanna King</em></a><em>, </em><a href="http://www.linkedin.com/in/savannah-buchanan-b75697110"><em>Savannah Buchanan</em></a><em>, </em><a href="https://www.linkedin.com/in/briannantran/"><em>Bri Tran</em></a></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da00dd67df73" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>