<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: t.k.langston</title>
    <description>The latest articles on DEV Community by t.k.langston (@designbytk).</description>
    <link>https://dev.to/designbytk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F810132%2F5ec72df7-5ab4-471d-baef-845ed8043a9d.jpeg</url>
      <title>DEV Community: t.k.langston</title>
      <link>https://dev.to/designbytk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/designbytk"/>
    <language>en</language>
    <item>
      <title>My Car Had a Check Engine Light. My Code Has console.log().</title>
      <dc:creator>t.k.langston</dc:creator>
      <pubDate>Wed, 26 Aug 2026 15:03:00 +0000</pubDate>
      <link>https://dev.to/designbytk/my-car-had-a-check-engine-light-my-code-has-consolelog-3g0n</link>
      <guid>https://dev.to/designbytk/my-car-had-a-check-engine-light-my-code-has-consolelog-3g0n</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Sometimes the Best Way to Find a Bug Is to Move It&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, the check engine light came on in my 2007 SUV. I plugged in an OBD scanner and got P003F: “Intake Camshaft Profile Control Stuck On, Bank 2.” Sounded menacing enough…&lt;/p&gt;

&lt;p&gt;Then there’s me. I know enough about cars to be adventurous. With my dad’s sage advice rattling around in my head, I can change parts, follow instructions and generally understand what some systems are trying to do, but I’m not a mechanic. So I did what most of us do when a warning light appears… went straight to the mechanic. Nah. I pulled out my phone and looked it up. (There’s another whole post on where we are with that process.)&lt;/p&gt;

&lt;p&gt;Back on the case: the code pointed toward the cam profile system, but that didn’t mean there was one obvious part to replace. According to the sources I was finding, it could be a solenoid, wiring, a connector, oil flow or something farther into the mechanical side of the engine. The more I read, the more familiar the whole thing started to feel. I had an error message and a collection of possible causes, but the error wasn’t actually telling me which one was responsible.&lt;/p&gt;

&lt;p&gt;Basically, I had a bug.&lt;/p&gt;

&lt;p&gt;What finally made the diagnosis interesting was discovering that the car has two identical solenoids controlling the same system across two groups of cylinders. That meant I had something much more useful than a list of possible problems. I had a way to test one.&lt;/p&gt;

&lt;p&gt;I did what any problem solver would do and swapped the solenoids, cleared the code and drove the car. Sure enough, the check engine light came back, which normally isn’t something to celebrate. This time it was! The code had changed from Bank 2 to Bank 1.&lt;/p&gt;

&lt;p&gt;The problem moved with the solenoid.&lt;/p&gt;

&lt;p&gt;At that point I wasn’t replacing a part because a forum post said it was probably bad. I had taken a component from one side of the system, moved it to the other side and watched the fault follow it. The wiring didn’t move. The connector didn’t move. The oil passage didn’t move. The solenoid did… and so did the error. I ordered a new one. At that point, the hard part was over.&lt;/p&gt;

&lt;p&gt;Somewhere during all of this it occurred to me that I spend a surprising amount of my working life doing essentially the same thing, just without an engine cover in the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Finding where it went wrong&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When something breaks in a website or application, the visible error tends to get most of the attention. Maybe a component doesn’t render, an API request fails, a Lambda function throws an error or the browser reports that something is undefined. That’s where you first see the problem, so naturally that’s where you start looking.&lt;/p&gt;

&lt;p&gt;But that’s not necessarily where anything went wrong.&lt;/p&gt;

&lt;p&gt;A front-end problem can begin several steps before the browser finally complains about it. The API may have returned something I wasn’t expecting. The API may be fine, but I transformed the response incorrectly. The error is often just the point where the system finally admits it has a problem.&lt;/p&gt;

&lt;p&gt;That’s where the car analogy started to stick with me. P003F told me Bank 2 had a problem. It didn’t tell me that Bank 2 was the problem. Once I moved the suspect component somewhere else, the distinction became obvious.&lt;/p&gt;

&lt;p&gt;We can do the same thing with code, and in many ways we have it easier because software lets us move things around without getting our hands dirty.&lt;/p&gt;

&lt;p&gt;Say I click a button and the number that appears on screen is wrong. There are a few places that could have happened: maybe I read the wrong value from the form, maybe the calculation is wrong, or maybe the function that puts the result on the page isn’t doing what I think it is. Rather than staring at all of it, I can give that last function a value I already know is correct. If it displays &lt;code&gt;$125.00&lt;/code&gt; when I hand it &lt;code&gt;125&lt;/code&gt;, then I haven’t fixed the bug… but I’ve probably eliminated the display code as the source of it.&lt;/p&gt;

&lt;p&gt;So I move backward. What value came out of the calculation? If that’s wrong, what values went into it? I might hard-code one of those values, bypass a function for a moment or drop a &lt;code&gt;console.log()&lt;/code&gt; between two steps to see exactly where the expected number changes. Each little test changes one thing and asks the system the same question the car test did: does the problem stay here… or does it move?&lt;/p&gt;

&lt;p&gt;That is a much different mindset than changing code until something starts working again.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;code&gt;console.log()&lt;/code&gt; as a diagnostic tool&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is probably why I’ve never quite accepted the idea that &lt;code&gt;console.log()&lt;/code&gt; is somehow an unsophisticated way to debug. Used badly, sure. A dozen logs that say &lt;code&gt;HERE&lt;/code&gt;, &lt;code&gt;HERE 2&lt;/code&gt;, and &lt;code&gt;WHY IS THIS NOT WORKING&lt;/code&gt; aren’t exactly observability.&lt;/p&gt;

&lt;p&gt;I’ve certainly written them anyway.&lt;/p&gt;

&lt;p&gt;Used deliberately, though, logging is really just a way of putting gauges, or breakpoints, along the route. When something goes wrong somewhere in a chain of JavaScript functions, I want to know what the data looked like along the way. I don’t necessarily need to read every line between point A and point B. I need to find the last place where everything was still what I expected it to be.&lt;/p&gt;

&lt;p&gt;So I might put a log before a function and another after it. If the value is right going in and wrong coming out… well, we’ve narrowed things down considerably. If there are eight meaningful stages between the user’s click and the bad result on screen, I might start somewhere around stage four rather than stage one.&lt;/p&gt;

&lt;p&gt;If everything looks right there, half of the system becomes considerably less interesting. If it’s already wrong, the other half does. Then I split the remaining half again. It’s essentially binary search applied to debugging, although I’d never really thought about it in those terms while doing it. Half the code on, half off. Bypass this section. Feed that section known-good data. Find the point where good becomes bad.&lt;/p&gt;

&lt;p&gt;Eventually there isn’t much room left for the bug to hide. Squeeze that little bugger…&lt;/p&gt;

&lt;p&gt;The important part is resisting the urge to change too much along the way. We’ve all had the debugging session where you modify three functions, update a package, clear a cache, restart something and suddenly everything works. Great… except now you don’t actually know why.&lt;/p&gt;

&lt;p&gt;The car test worked precisely because I didn’t do that. I changed one thing. I moved the solenoid. When the fault moved with it, the car had answered the question for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;No lack of tooling&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Of course, software gives us another advantage. We have an absurd amount of tooling designed to catch problems before we ever get to this stage. Linters, types, tests and IDE warnings are all standing along the road waving little flags before the check engine light even comes on. We’re a long way from hunting through 1,698 lines of JavaScript for the missing semicolon.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log()&lt;/code&gt; isn’t the Holy Grail here. It’s just one particularly simple diagnostic tool, and one that happens to make the parallel with the car especially obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Taking things apart&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Somewhere in the middle of all this, I realized I’d probably been primed to think about the problem this way because I’ve spent an unreasonable amount of time watching &lt;a href="https://www.youtube.com/@MatArmstrongbmx" rel="noopener noreferrer"&gt;Mat Armstrong&lt;/a&gt; rebuild damaged cars on YouTube. He buys cars that most sensible people would look at and immediately decide should remain someone else’s problem, then starts taking them apart.&lt;/p&gt;

&lt;p&gt;A McLaren or Ferrari can look catastrophically damaged when it arrives, but the interesting part is figuring out what is &lt;em&gt;actually&lt;/em&gt; damaged. Some things obviously need replacing. Others look terrible but are fine. Something that appears fine turns out not to be. One repair reveals the next problem, and eventually what began as a wreck becomes a collection of smaller, understandable problems.&lt;/p&gt;

&lt;p&gt;I find it captivating to watch them chase those problems down, probably because it scratches the same problem-solving itch that development does.&lt;/p&gt;

&lt;p&gt;I rarely understand the whole problem at the beginning. I have a symptom and a rough mental model of the system, then I start taking it apart, figuratively at least, until I understand enough of it to make the next decision.&lt;/p&gt;

&lt;p&gt;That might be the real parallel here. I didn’t understand the entire cam profile system when that check engine light came on, and I didn’t need to. I just needed to understand enough to figure out what to test next.&lt;/p&gt;

&lt;p&gt;The same is true when I’m staring at a piece of code that isn’t doing what I expected. I don’t necessarily need to understand the entire system before I can start narrowing things down. I need a hypothesis, a way to test it and enough patience not to change three other things while I’m waiting for the answer.&lt;/p&gt;

&lt;p&gt;Sometimes that means better tooling. Sometimes it means a breakpoint. Sometimes it means turning half the code off.&lt;/p&gt;

&lt;p&gt;And sometimes it’s just &lt;code&gt;console.log()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Either way, the goal is the same… give the problem fewer and fewer places to hide.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>debugging</category>
      <category>programming</category>
    </item>
    <item>
      <title>Art Director’s Advantage in the AI Gen Era</title>
      <dc:creator>t.k.langston</dc:creator>
      <pubDate>Wed, 22 Jul 2026 18:53:42 +0000</pubDate>
      <link>https://dev.to/designbytk/art-directors-advantage-in-the-ai-gen-era-4a3k</link>
      <guid>https://dev.to/designbytk/art-directors-advantage-in-the-ai-gen-era-4a3k</guid>
      <description>&lt;h1&gt;
  
  
  Round and round we go
&lt;/h1&gt;

&lt;p&gt;Gaining an advantage in AI design workflow's isn't based on better prompting. It's something we've been doing for decades...&lt;/p&gt;

&lt;p&gt;First off, this isn’t an "AI is taking my job" post. It’s a "who’s already got an edge?" post.&lt;/p&gt;




&lt;p&gt;As AI settles into creative workflows, a divide is opening up. Some people consistently get better results. Experience helps, but something deeper is at play... an insight sitting in plain sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the Art Director
&lt;/h2&gt;

&lt;p&gt;I’ve never carried the title, but I’ve worked with enough Art Directors to appreciate their superpower. It isn’t simply seeing the vision... it’s being able to articulate it. They instinctively know how to explain why something isn’t working and what needs to change.&lt;/p&gt;

&lt;p&gt;They choose words that shape an idea. Words that &lt;em&gt;push, pull, tighten, soften, emphasize, and refine&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Think about a typical creative brief. It rarely says, &lt;strong&gt;&lt;em&gt;"Make a brochure."&lt;/em&gt;&lt;/strong&gt; It says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"The typography should feel established, but not corporate."&lt;/li&gt;
&lt;li&gt;"Give the layout room to breathe."&lt;/li&gt;
&lt;li&gt;"The call-to-action should feel confident, not aggressive."&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;None of those are technical instructions. They're creative direction. Today, the prompt bar is simply a new creative brief. Those same words can guide an AI model to the same destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt Seekers Lament
&lt;/h2&gt;

&lt;p&gt;Sometimes we become prompt seekers, searching for a magical combination of words that will produce perfection on the first try.&lt;/p&gt;

&lt;p&gt;Anyone in design knows how unrealistic that is.&lt;/p&gt;

&lt;p&gt;The first concept is rarely the finished concept. Designer presents, client reacts, designer refines, client reacts again... and round you go.&lt;/p&gt;

&lt;p&gt;Iteration wasn't a workaround. It was the process all along.&lt;/p&gt;

&lt;p&gt;Yet the trend on X is always some eye-catching image with everyone asking for the "one-and-done" prompt.&lt;/p&gt;

&lt;p&gt;AI is great at creating options. It's much less impressive at knowing which option is right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cue the Director
&lt;/h2&gt;

&lt;p&gt;Instead of saying, "Something isn't right," an Art Director diagnoses the problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The composition is balanced, but the visual hierarchy competes with the message. Reduce secondary elements, increase contrast on the subject, and let negative space do the work."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;That's the difference. It isn't better prompting.&lt;/p&gt;

&lt;p&gt;It's knowing what to ask for next. The ongoing conversation is where the real creative direction happens.&lt;/p&gt;

&lt;p&gt;Sometimes that direction means knowing when AI isn't the right tool. Today's workflow might mean moving from ChatGPT to Nano Banana, switching image models, or (wild concept) handing it off to another human.&lt;/p&gt;

&lt;p&gt;The role of an Art Director has never been to personally create every piece of work. It's knowing how to get the best work out of the tools and people available.&lt;/p&gt;

&lt;p&gt;We already do this when we bounce between models based on their strengths or plug in system prompts and style references. But style matching isn't direction.&lt;/p&gt;




&lt;p&gt;No specific lessons here... or are there? Just an observation.&lt;/p&gt;

&lt;p&gt;Well, a shared one (as Adobe recently noted in their piece, "Creative direction: The secret to great AI images").&lt;/p&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>design</category>
    </item>
  </channel>
</rss>
