<?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: Tawanda Nyahuye</title>
    <description>The latest articles on DEV Community by Tawanda Nyahuye (@towernter).</description>
    <link>https://dev.to/towernter</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%2F393559%2Fe536d6a8-f2a6-47dd-a600-682c1ea4a48e.jpg</url>
      <title>DEV Community: Tawanda Nyahuye</title>
      <link>https://dev.to/towernter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/towernter"/>
    <language>en</language>
    <item>
      <title>Automate Spotify and YouTube Playlists - Chapter 2: Setting Up Spotify</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Tue, 21 Jul 2026 05:55:59 +0000</pubDate>
      <link>https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-2-setting-up-spotify-3jpj</link>
      <guid>https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-2-setting-up-spotify-3jpj</guid>
      <description>&lt;p&gt;In Chapter 1, we talked about what we're building and what accounts you need. If you've got a Spotify account, a Google account, and a GitHub account ready, you're exactly where you need to be.&lt;/p&gt;

&lt;p&gt;Today we set up Spotify. By the end of this chapter, you'll have three things: a &lt;code&gt;CLIENT_ID&lt;/code&gt;, a &lt;code&gt;CLIENT_SECRET&lt;/code&gt;, and a &lt;code&gt;REFRESH_TOKEN&lt;/code&gt;. These are the keys that let our script talk to Spotify on your behalf.&lt;/p&gt;

&lt;p&gt;Let's go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Create a Spotify Developer App
&lt;/h2&gt;

&lt;p&gt;Open your browser and go to &lt;a href="https://developer.spotify.com" rel="noopener noreferrer"&gt;developer.spotify.com&lt;/a&gt;. Log in with your regular Spotify account — the same one you use to listen to music.&lt;/p&gt;

&lt;p&gt;Once you're in, click on your profile name at the top right, then click &lt;strong&gt;Dashboard&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll land on a page that says "My Apps" with a button that says &lt;strong&gt;Create app&lt;/strong&gt;. Click it.&lt;/p&gt;

&lt;p&gt;A form appears. Fill it in like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App name:&lt;/strong&gt; Something descriptive. I'll use &lt;code&gt;youtube-to-spotify&lt;/code&gt;. You can name yours whatever you like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App description: "&lt;/strong&gt; \"Syncs a YouTube playlist to Spotify.\" One sentence is enough."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirect URI:&lt;/strong&gt; Type exactly this: &lt;code&gt;http://127.0.0.1:8888/callback&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That Redirect URI looks technical, but it's just a local address on your own computer that Spotify will use during the one-time login step we'll do shortly. Copy it exactly as written.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APIs used:&lt;/strong&gt; Check the box for &lt;strong&gt;Web API&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Accept the terms and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your app is created. You'll land on the app's settings page.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Copy Your Client ID and Client Secret
&lt;/h2&gt;

&lt;p&gt;On your app's settings page, you'll see two values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client ID&lt;/strong&gt; — visible immediately, a long string of letters and numbers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Secret&lt;/strong&gt; — click "View client secret" to reveal it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy both of these somewhere safe for now — a notes app, a text file, anywhere. We'll put them in the right place in Chapter 5 when we set up our project.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These two values identify your app to Spotify. The Client ID is like a username. The Client Secret is like a password. Don't share them publicly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3: Get Your Refresh Token (The One-Time Login)
&lt;/h2&gt;

&lt;p&gt;This is the step that trips most people up, so read carefully. I promise it's not as bad as it looks.&lt;/p&gt;

&lt;p&gt;Here's why we need a Refresh Token: when our script runs automatically every day on GitHub, nobody is sitting there to log in to Spotify. The script needs a way to prove it has permission to modify your playlists without you clicking "Login" every time. The Refresh Token is that proof — a long-lived credential you get once, store safely, and the script uses forever.&lt;/p&gt;

&lt;p&gt;We get it by doing a one-time login flow. Here's how.&lt;/p&gt;

&lt;h3&gt;
  
  
  3a. Build the Login URL
&lt;/h3&gt;

&lt;p&gt;Take the URL below and replace &lt;code&gt;YOUR_CLIENT_ID&lt;/code&gt; with your actual Client ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://accounts.spotify.com/authorize?client_id=YOUR_CLIENT_ID&amp;amp;response_type=code&amp;amp;redirect_uri=http://127.0.0.1:8888/callback&amp;amp;scope=playlist-modify-public%20playlist-modify-private
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste that full URL into your browser and press Enter.&lt;/p&gt;

&lt;p&gt;Spotify will ask you to log in (if you aren't already) and then show a permissions screen asking if you want to give your app access to your playlists. Click &lt;strong&gt;Agree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After you click Agree, your browser will try to open a page at &lt;code&gt;http://127.0.0.1:8888/callback&lt;/code&gt; — and it will fail with something like "This site can't be reached." That's completely fine and expected. We haven't built a server to catch that request. What we need is already in the browser's address bar.&lt;/p&gt;

&lt;p&gt;Look at the URL in your address bar. It will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8888/callback?code=AQBvXw3Kv...a_very_long_string_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy everything after &lt;code&gt;?code=&lt;/code&gt;. That long string is your &lt;strong&gt;authorization code&lt;/strong&gt;. Don't close the tab yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  3b. Exchange the Code for a Refresh Token
&lt;/h3&gt;

&lt;p&gt;Now we'll swap that code for a Refresh Token using a tool called &lt;code&gt;curl&lt;/code&gt;. If you're on Windows, open &lt;strong&gt;Command Prompt&lt;/strong&gt;. On Mac or Linux, open &lt;strong&gt;Terminal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Run this command, replacing the three placeholder values with your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://accounts.spotify.com/api/token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"grant_type=authorization_code"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"code=YOUR_AUTHORIZATION_CODE"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"redirect_uri=http://127.0.0.1:8888/callback"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"YOUR_CLIENT_ID:YOUR_CLIENT_SECRET"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;curl&lt;/code&gt; isn't available on your Windows machine, you can use PowerShell instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://accounts.spotify.com/api/token"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Headers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Authorization&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Basic "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;ToBase64String&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;ASCII&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GetBytes&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_CLIENT_ID:YOUR_CLIENT_SECRET"&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;grant_type&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"authorization_code"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_AUTHORIZATION_CODE"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;redirect_uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:8888/callback"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press Enter. You'll get back a block of JSON that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BQA...short_lived_token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"refresh_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AQA...this_is_the_one_you_want"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"playlist-modify-private playlist-modify-public"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value next to &lt;code&gt;"refresh_token"&lt;/code&gt; is what we're after. Copy it and keep it safe alongside your Client ID and Client Secret.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;access_token&lt;/code&gt; expires in an hour. The &lt;code&gt;refresh_token&lt;/code&gt; doesn't expire (unless you revoke it). Our script uses the Refresh Token to generate a fresh access token every time it runs — that's why it works unattended.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Note Your Spotify Playlist ID
&lt;/h2&gt;

&lt;p&gt;Remember the playlist you created in Chapter 1? We need its ID.&lt;/p&gt;

&lt;p&gt;Open Spotify, right-click on your playlist, and select &lt;strong&gt;Share → Copy link to playlist&lt;/strong&gt;. You'll get a link like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part after &lt;code&gt;/playlist/&lt;/code&gt; is your Playlist ID. In the example above, that's &lt;code&gt;37i9dQZF1DXcBWIGoYBM5M&lt;/code&gt;. Copy that too.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Have Now
&lt;/h2&gt;

&lt;p&gt;At the end of this chapter, you should have four things written down:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where to find it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLIENT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spotify Developer Dashboard → Your App → Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spotify Developer Dashboard → Your App → Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REFRESH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;From the curl/PowerShell command above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPOTIFY_PLAYLIST_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;From the share link of your playlist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These go into our &lt;code&gt;.env&lt;/code&gt; file in Chapter 5. Keep them private.&lt;/p&gt;




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

&lt;p&gt;In Chapter 3, we set up the YouTube side. We'll enable the YouTube Data API, grab an API key, and get the ID of the YouTube playlist we want to mirror.&lt;/p&gt;

&lt;p&gt;See you there.&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>music</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Automate Spotify and YouTube Playlists - Chapter 1: Understanding The Plan, Setting Up Accounts</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Mon, 20 Jul 2026 05:34:43 +0000</pubDate>
      <link>https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-1-understanding-the-plan-setting-up-accounts-p6e</link>
      <guid>https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-1-understanding-the-plan-setting-up-accounts-p6e</guid>
      <description>&lt;p&gt;Have you ever been deep in a YouTube rabbit hole, vibing to a playlist either you or someone made, and thought: &lt;em&gt;"I wish I could listen to this on Spotify while I pretend to be productive at work"?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, my friend. It's your lucky day.&lt;/p&gt;

&lt;p&gt;We are going to build a Python script that watches a YouTube playlist and automatically mirrors it on Spotify. Every day. Without you lifting a finger. Like a personal music intern who works for free and never complains.&lt;/p&gt;

&lt;p&gt;And before you close this tab because I said "Python script" — stay with me. This tutorial is for &lt;strong&gt;everyone&lt;/strong&gt;. Coders, non-coders, the person who still thinks Wi-Fi is witchcraft. We are going step by step, and nobody gets left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are We Actually Building?
&lt;/h2&gt;

&lt;p&gt;Here's the vibe in plain English:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Every day at midnight, a computer (well, GitHub's computer — more on that later) checks a YouTube playlist, finds all those songs on Spotify, and keeps our Spotify playlist perfectly synced."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. That's the whole product. Your YouTube playlist becomes a live feed for your Spotify playlist. Songs added on YouTube? Added on Spotify. Songs removed? Gone from Spotify too. You just... listen.&lt;/p&gt;

&lt;p&gt;Here's a peek at what the finished script does when it runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;----------------------------------------------------------------------------
Search Query: Don’t Stop ’til You Get Enough Michael Jackson
1. Found: Don’t Stop ’Til You Get Enough by Michael Jackson
----------------------------------------------------------------------------
Search Query: I Was Made for Lovin’ You Kiss
2. Found: I Was Made for Lovin’ You by Kiss
----------------------------------------------------------------------------
Search Query: Some Random Deleted Video
3. Skipped (Deleted/Private): [Deleted video]
----------------------------------------------------------------------------
Search Query: Very Obscure Song Title
4. Song Not Found: Very Obscure Song Title

Summary:
Total YouTube songs: 100
Found on Spotify: 97
Not Found on Spotify: 3
Added to playlist: 12
Removed from playlist: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. Automatic. No manual effort. Let's build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an API? (The Non-Nerd Explanation)
&lt;/h2&gt;

&lt;p&gt;Almost every app you use — Spotify, YouTube, WhatsApp, Instagram — has two faces.&lt;/p&gt;

&lt;p&gt;There's the pretty face: the app you see on your phone with the nice buttons and animations. And then there's the &lt;strong&gt;back door&lt;/strong&gt;, which developers use to talk to the app directly without clicking any buttons. That back door is called an &lt;strong&gt;API&lt;/strong&gt; (Application Programming Interface).&lt;/p&gt;

&lt;p&gt;Think of it like this. If Spotify were a restaurant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app on your phone is the dining area — nice tablecloths, a menu with pictures.&lt;/li&gt;
&lt;li&gt;The API is the kitchen window where you shout your order directly to the chef, skip the waiter, and get your food in a bag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For almost every popular website — &lt;code&gt;spotify.com&lt;/code&gt; — there's a &lt;code&gt;developer.spotify.com&lt;/code&gt;. That's the kitchen window. And that's exactly where we're going.&lt;/p&gt;

&lt;p&gt;In this series, we'll be talking to two kitchens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎵 &lt;strong&gt;Spotify's kitchen&lt;/strong&gt;: &lt;code&gt;developer.spotify.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📺 &lt;strong&gt;YouTube's kitchen&lt;/strong&gt; (run by Google): &lt;code&gt;console.developers.google.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Series Map
&lt;/h2&gt;

&lt;p&gt;Here's where we're going, so you know what to pack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chapter&lt;/th&gt;
&lt;th&gt;What We're Doing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Chapter 1&lt;/strong&gt; (you are here)&lt;/td&gt;
&lt;td&gt;Understanding the plan, setting up accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chapter 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Setting up Spotify — creating an app, getting our secret keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chapter 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Setting up YouTube — getting our API key, finding our playlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chapter 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Writing the simplified code — what each part does&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chapter 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Running it on your computer for the first time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chapter 6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deploying to GitHub Actions — making it run daily, forever, for free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By the end of this series, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Spotify playlist that auto-updates from YouTube&lt;/li&gt;
&lt;li&gt;The code on GitHub (public, your first open-source project!)&lt;/li&gt;
&lt;li&gt;A GitHub Action running it every day on a schedule&lt;/li&gt;
&lt;li&gt;Bragging rights&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What You'll Need (Before We Write a Single Line of Code)
&lt;/h2&gt;

&lt;p&gt;Good news: Chapter 1 requires zero coding. You just need accounts. Here's the shopping list:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A Spotify Account
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://spotify.com" rel="noopener noreferrer"&gt;spotify.com&lt;/a&gt; and sign up if you haven't. The free tier works fine for our purposes. You don't need Premium to use the API.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Create a fresh playlist on Spotify right now and call it whatever you want (I will be using this: 70's Music Hits Playlist - Best of 70s Music). This is going to be the playlist our script writes to. Don't put anything precious in it yet — we're going to be playing with it. Later on you should be able to grab any playlist of your choice from YouTube Playlists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. A Google Account
&lt;/h3&gt;

&lt;p&gt;You probably already have one. The YouTube API lives inside Google's developer tools, and you'll log in with your regular Google account. If you use Gmail, you're already there.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A GitHub Account
&lt;/h3&gt;

&lt;p&gt;GitHub is where we'll store our code and (in the final chapter) run it automatically for free every day. Sign up at &lt;a href="https://github.com" rel="noopener noreferrer"&gt;github.com&lt;/a&gt; if you don't have one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GitHub is basically Google Drive, but for code. Instead of documents, you store code files. Instead of sharing a link to a spreadsheet, you share a link to your project. It's very normal and not scary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Python (We'll Install This Together)
&lt;/h3&gt;

&lt;p&gt;Python is the programming language our script is written in. We'll install it together in Chapter 5. For now, just know it exists, and it's friendly. It reads almost like English, which is why we picked it.&lt;/p&gt;

&lt;p&gt;That's your whole list. Four accounts (you probably have three already), and we're off to the races.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Note on "Secret Keys"
&lt;/h2&gt;

&lt;p&gt;When you connect to Spotify's or YouTube's API, they give you what are called &lt;strong&gt;credentials&lt;/strong&gt; — essentially a username and password for your app. These are private. You never share them publicly.&lt;/p&gt;

&lt;p&gt;In our project, we'll store these in a file called &lt;code&gt;.env&lt;/code&gt; (dotenv — just a text file with a funny name). It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;abc123&lt;/span&gt;
&lt;span class="py"&gt;CLIENT_SECRET&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;xyz789&lt;/span&gt;
&lt;span class="py"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;my_youtube_key_here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as the password notebook that lives only on your computer (and later, securely on GitHub). We will &lt;strong&gt;never&lt;/strong&gt; put this file on the internet. The code goes on GitHub. The secrets stay private.&lt;/p&gt;

&lt;p&gt;This is an industry standard practice. Every real app does this. You're already coding like a professional and you haven't written a line yet. 😎&lt;/p&gt;




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

&lt;p&gt;In &lt;strong&gt;Chapter 2&lt;/strong&gt;, we head to &lt;code&gt;developer.spotify.com&lt;/code&gt;, create our app, and walk away with the three magic keys we need: a &lt;code&gt;CLIENT_ID&lt;/code&gt;, a &lt;code&gt;CLIENT_SECRET&lt;/code&gt;, and a &lt;code&gt;REFRESH_TOKEN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Yes, there are three of them. No, it's not complicated. Yes, I'll show you exactly where to click.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎵 Final Product
&lt;/h2&gt;

&lt;p&gt;After following the steps in this tutorial, your playlist should look similar to the one below:&lt;/p&gt;

&lt;p&gt;🎧 &lt;a href="https://open.spotify.com/playlist/1jjZSRsX7kQhrNQY9RHXHo?si=05fe91ce01244c06" rel="noopener noreferrer"&gt;View the completed Spotify Playlist&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;See you there. 🎧&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Got questions? Drop them in the comments. See something confusing? Tell me which part so I can fix it. This series only works if everyone can follow along.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>music</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Automate Spotify and YouTube Playlists - The Complete Series</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Sun, 19 Jul 2026 19:40:37 +0000</pubDate>
      <link>https://dev.to/towernter/automate-spotify-and-youtube-playlists-the-complete-series-1b9o</link>
      <guid>https://dev.to/towernter/automate-spotify-and-youtube-playlists-the-complete-series-1b9o</guid>
      <description>&lt;p&gt;Have you ever liked a YouTube playlist so much that you want to take it with you to Spotify? &lt;/p&gt;

&lt;p&gt;This series walks you through building a Python script that syncs a YouTube playlist to Spotify automatically, every day, without you lifting a finger. No experience required. By the end, you'll have real code running on a real schedule, and a Spotify playlist that keeps itself up to date.&lt;/p&gt;

&lt;p&gt;Here's everything, in order.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Series
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-apple-and-youtube-music-playlists-f7c"&gt;Chapter 1: Understanding the Plan, Setting Up Accounts&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
What we're building, how APIs work without the jargon, and the four accounts you need before writing a single line of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-2-setting-up-spotify-314a"&gt;Chapter 2: Setting Up Spotify&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Creating a Spotify developer app, getting your Client ID and Client Secret, and walking through the one-time login flow that gets you a Refresh Token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-3-setting-up-youtube-4nk1"&gt;Chapter 3: Setting Up YouTube&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Enabling the YouTube Data API on Google Cloud, generating an API key, and finding the playlist ID of the YouTube playlist you want to mirror.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-4-writing-the-code-4b5a"&gt;Chapter 4: Writing the Code&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A plain-English walkthrough of all three files — &lt;code&gt;youtube.py&lt;/code&gt;, &lt;code&gt;spotify.py&lt;/code&gt;, and &lt;code&gt;script.py&lt;/code&gt; — and what each part actually does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-5-running-it-locally-g0f"&gt;Chapter 5: Running It Locally&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Installing Python, setting up the project folder, and running the script for the first time. You'll watch it pull songs from YouTube and build your Spotify playlist live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/towernter/automate-spotify-and-youtube-playlists-chapter-6-deployment-4lmh"&gt;Chapter 6: Deployment&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Pushing the code to GitHub and setting up a GitHub Action that runs the sync every day on a schedule — for free, forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;

&lt;p&gt;The full source code is on GitHub: &lt;a href="https://github.com/Towernter/youtube-to-spotify" rel="noopener noreferrer"&gt;github.com/Towernter/youtube-to-spotify&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;This series is for everyone. If you can follow a recipe, you can follow this. The chapters that involve code explain every line in plain English — no assumed knowledge. If something doesn't make sense, drop a comment on that chapter, and I'll fix the explanation.&lt;/p&gt;

&lt;p&gt;Start at Chapter 1 and work through in order. Each chapter ends exactly where the next one begins.&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>music</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Closed World Innovation: Stop Telling People to "Think Outside the Box." There Is No Box.</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:14:21 +0000</pubDate>
      <link>https://dev.to/towernter/closed-world-innovation-stop-telling-people-to-think-outside-the-box-there-is-no-box-50bk</link>
      <guid>https://dev.to/towernter/closed-world-innovation-stop-telling-people-to-think-outside-the-box-there-is-no-box-50bk</guid>
      <description>&lt;p&gt;"Think outside the box!"&lt;/p&gt;

&lt;p&gt;Great advice. Incredibly helpful. One small problem: nobody knows where the box is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What even is creativity, anyway?
&lt;/h2&gt;

&lt;p&gt;Before we get to boxes and closed worlds and all that fun stuff, let's settle on what creativity actually means, because "be creative" is about as actionable as "be taller."&lt;/p&gt;

&lt;p&gt;Creativity is when two things are both high at the same time: &lt;strong&gt;originality&lt;/strong&gt; and &lt;strong&gt;usefulness&lt;/strong&gt;. That's it. Something no one's ever seen before &lt;em&gt;and&lt;/em&gt; something that actually works. Just weird? Not creative. Just useful? Also, not creative, that's just engineering. Both? That's the good stuff.&lt;/p&gt;

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

&lt;p&gt;There's also simplicity in the mix, but let's not get greedy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "think outside the box" is terrible advice
&lt;/h2&gt;

&lt;p&gt;Here's what actually happens when you tell someone to think outside the box.&lt;/p&gt;

&lt;p&gt;They imagine a box. Then they try to think around it. And because the box they imagined is shaped by the exact same problem they're trying to solve, they end up either with solutions so bizarre they'd never survive contact with reality, or they circle all the way back to the traditional solution they started with.&lt;/p&gt;

&lt;p&gt;You've just run a very tiring mental exercise to arrive at the answer you already had. Congratulations.&lt;/p&gt;

&lt;p&gt;The phrase also has another problem: in the real world, there are no boxes. No one drew a boundary around your problem and labeled it "the box." The "box" is just a metaphor that your brain takes too literally and then gets confused by.&lt;/p&gt;

&lt;p&gt;The correct term, the one that actually helps, is the &lt;strong&gt;Closed World&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what's the Closed World?
&lt;/h2&gt;

&lt;p&gt;The Closed World was discovered by a researcher named Roni Horowitz, and the idea is almost annoyingly counterintuitive:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideas are more creative when they are &lt;em&gt;confined&lt;/em&gt; to what's already around you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not outside. Not somewhere exotic. Right there. The resources, people, components, and constraints you already have are your closed world. And here's the punchline: constraints don't kill creativity. They &lt;em&gt;enhance&lt;/em&gt; it.&lt;/p&gt;

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

&lt;p&gt;Think about soldiers frying eggs on a shovel over a campfire because there's no pan. Or a forklift being used as an improvised cherry picker because there's no ladder tall enough. Nobody went outside their world to solve those problems. They looked at what they already had and asked: &lt;em&gt;what else can this do?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the closed world doing its thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why constraints are actually your friends
&lt;/h2&gt;

&lt;p&gt;You'd think unlimited freedom would produce unlimited creativity. That sounds logical. It is also completely wrong.&lt;/p&gt;

&lt;p&gt;When you have too many options, your brain does the creative equivalent of standing in front of a massive restaurant menu for twenty minutes and ordering a burger. You default to the familiar because the familiar is safe, and you're overwhelmed.&lt;/p&gt;

&lt;p&gt;Constraints force your brain to actually work. When you can't reach outside the problem, you start looking at the problem differently. You start noticing things about what you &lt;em&gt;have&lt;/em&gt; that you'd ignored before. Sometimes the solution was sitting right there the whole time, like the answer to a riddle you'd been overthinking.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The thing traditional thinking gets wrong about problems
&lt;/h2&gt;

&lt;p&gt;Traditional thinking says: problems are bad, solutions are good. Get rid of the problem as fast as possible and replace it with a solution.&lt;/p&gt;

&lt;p&gt;This sounds sensible. It is also why so many solutions are completely forgettable.&lt;/p&gt;

&lt;p&gt;If you sprint away from a problem, you never actually understand it. And if you don't understand it, you can't use it. Because here's the thing: &lt;strong&gt;in many cases, the problem itself is part of the creative solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem contains information. It contains context. It contains constraints. And those constraints, if you work within them instead of around them, are exactly what will lead you to something original and useful, you know, the two things that make something creative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apollo 13, the ultimate closed world story
&lt;/h2&gt;

&lt;p&gt;If you want to see closed world thinking in action at its most dramatic, look up the Apollo 13 CO2 filter problem. The astronauts had square filter cartridges. The ship needed round ones. People were going to die.&lt;/p&gt;

&lt;p&gt;The engineers at NASA didn't order new parts. They couldn't. They couldn't go outside the closed world; they were literally 200,000 miles from the nearest hardware store.&lt;/p&gt;

&lt;p&gt;So they sat down with exactly what was on that spacecraft and figured out how to fit a square peg in a round hole. And they did.&lt;/p&gt;

&lt;p&gt;That's not thinking outside the box. That's thinking &lt;em&gt;inside&lt;/em&gt; the only world available, and doing it brilliantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do with this?
&lt;/h2&gt;

&lt;p&gt;Next time you're stuck on a problem, instead of trying to escape it, do this:&lt;/p&gt;

&lt;p&gt;Draw your closed world. What people, tools, components, and resources are already part of this situation? What's right in front of you that you haven't thought to repurpose? What does the problem itself tell you about the solution?&lt;/p&gt;

&lt;p&gt;Then stay there. Don't go looking for something exotic. The opportunity is usually right under your nose; you've just been too busy looking for a box to climb out of.&lt;/p&gt;

&lt;p&gt;Stop thinking outside the box. Start thinking inside the closed world. The answers you need are probably already in the room.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>New To Backend Development? What You Should Learn</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Mon, 06 Jul 2026 05:38:09 +0000</pubDate>
      <link>https://dev.to/towernter/new-to-backend-development-what-you-should-learn-193f</link>
      <guid>https://dev.to/towernter/new-to-backend-development-what-you-should-learn-193f</guid>
      <description>&lt;p&gt;Every week someone asks me some flavour of the same question: &lt;em&gt;"I want to get into backend, what should I learn?"&lt;/em&gt; And nine times out of ten, they've already found The Roadmap. They stared at it for ten minutes and quietly concluded that backend development is a thing for other, smarter people.&lt;/p&gt;

&lt;p&gt;The honest answer is much shorter than the roadmap makes it look, and it starts with something that isn't even &lt;em&gt;on&lt;/em&gt; the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step zero: pick a language and marry it
&lt;/h2&gt;

&lt;p&gt;There's a line usually pinned on Bruce Lee:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I fear not the man who has practiced 10,000 kicks once, but the man who has practiced one kick 10,000 times.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the entire beginner strategy in one sentence.&lt;/p&gt;

&lt;p&gt;Pick &lt;strong&gt;one&lt;/strong&gt; language. Java, C#, Python, PHP, Go, JavaScript, pick the one your local job market actually hires for, and then stop shopping. The developer who knows one language &lt;em&gt;deeply&lt;/em&gt; will run circles around the one who knows five languages well enough to be dangerous and not one of them well enough to be hired.&lt;/p&gt;

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

&lt;p&gt;I know the temptation, because language-hopping &lt;em&gt;feels&lt;/em&gt; like progress. New syntax! New shiny tutorial! A fresh "Hello World" in a fresh colour scheme! But it's a trap, you're just re-learning the same beginner content five times in different fonts. Variables are variables. Loops are loops. Functions are functions. Learn them properly once, in one language, and every other language afterwards is just the same kick with a slightly different accent.&lt;/p&gt;

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

&lt;p&gt;And here's the part that makes the rest of this list far less scary: &lt;strong&gt;almost nothing below is actually about the language.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  These are concepts, not frameworks
&lt;/h2&gt;

&lt;p&gt;This is the thing nobody tells beginners, so they panic and assume they have to re-learn everything every time they switch stacks. You don't.&lt;/p&gt;

&lt;p&gt;REST is REST whether you write &lt;code&gt;@RestController&lt;/code&gt; in Spring Boot, a controller in ASP.NET, a view in Django, or a route in Laravel. A database index works the same way underneath all four. JWT doesn't care what language signed it. Caching is caching. The frameworks are just different dialects for saying the same ten ideas.&lt;/p&gt;

&lt;p&gt;So when you learn the concepts below, you're not learning "the Spring Boot way", you're learning the &lt;em&gt;backend&lt;/em&gt; way, and your framework is just where you happen to type it. Learn it once; carry it everywhere.&lt;/p&gt;

&lt;p&gt;Now, the list itself. Concepts don't arrive all at once. They arrive &lt;em&gt;in an order&lt;/em&gt;, each one because the previous thing started to hurt. So here's that order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1 — Make it &lt;em&gt;work&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;This is where you live for your first several months, and honestly, it's enough to get hired.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIs (REST, GraphQL, gRPC).&lt;/strong&gt; An API is just the contract for how the outside world talks to your code. Start with &lt;strong&gt;REST&lt;/strong&gt;, it's the lingua franca, it's everywhere, and 90% of jobs want it. Learn what the HTTP verbs mean (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;), what status codes are for (a &lt;code&gt;404&lt;/code&gt; and a &lt;code&gt;500&lt;/code&gt; are telling the client very different things), and what a clean JSON request and response look like. &lt;strong&gt;GraphQL&lt;/strong&gt; (ask for exactly the fields you want) and &lt;strong&gt;gRPC&lt;/strong&gt; (fast, binary, great between services) are real and useful,but they're chapter two. Don't let them distract you from nailing REST first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Systems (SQL, NoSQL).&lt;/strong&gt; Your app forgets everything the moment it restarts unless you give it somewhere to remember. That's the database. Learn &lt;strong&gt;SQL&lt;/strong&gt; first, properly, no skipping, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;JOIN&lt;/code&gt;, &lt;code&gt;WHERE&lt;/code&gt;, and crucially &lt;em&gt;indexes&lt;/em&gt; (the difference between a query that takes 2 milliseconds and one that takes 2 minutes). PostgreSQL or MySQL are perfect to learn on. &lt;strong&gt;NoSQL&lt;/strong&gt; (MongoDB and friends) is for when your data is genuinely document-shaped or you have a specific reason, not because relational tables look scary. Most beginners reach for NoSQL to avoid learning SQL, and then learn SQL anyway, the hard way, two years later.&lt;/p&gt;

&lt;p&gt;Ship a small CRUD app with just these two. Seriously. An endpoint that talks to a database is a complete, employable backend skill. Everything below is what you add &lt;em&gt;when that app starts getting used.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 2 — Make it &lt;em&gt;safe&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The moment a real human can reach your app, you have a new problem: not everyone is nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security (OAuth2, JWT, encryption).&lt;/strong&gt; This is the one beginners skip and later deeply regret. Learn the difference between &lt;strong&gt;authentication&lt;/strong&gt; (&lt;em&gt;who are you?&lt;/em&gt;) and &lt;strong&gt;authorization&lt;/strong&gt; (&lt;em&gt;what are you allowed to do?&lt;/em&gt;), they're different jobs and confusing them is how breaches happen. &lt;strong&gt;JWT&lt;/strong&gt; is how you carry "I'm logged in" between requests (and remember: a JWT is &lt;em&gt;signed, not secret&lt;/em&gt;, never stuff passwords in it). &lt;strong&gt;OAuth2&lt;/strong&gt; is the "Log in with Google" dance. &lt;strong&gt;Encryption&lt;/strong&gt; is the difference between storing passwords safely and ending up in a data-breach headline. You don't need to be a cryptographer. You need to hash your passwords, check that the logged-in user actually owns the thing they're touching, and never trust input from the outside world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 3 — Make it &lt;em&gt;real&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Your app works on your laptop. Congratulations, your laptop is not the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps (CI/CD, Docker, Kubernetes).&lt;/strong&gt; &lt;strong&gt;Docker&lt;/strong&gt; comes first and is genuinely worth learning early: it packages your app so it runs the same on your machine, your teammate's machine, and the server. It single-handedly kills, "but it works on my machine." &lt;strong&gt;CI/CD&lt;/strong&gt; is the robot that runs your tests and ships your code automatically so you stop deploying by dragging files around at midnight. &lt;strong&gt;Kubernetes&lt;/strong&gt;, though? Here's me being the annoying friend: &lt;em&gt;You do not need Kubernetes.&lt;/em&gt; You have eleven users, and three of them are your co-founders. Kubernetes orchestrates hundreds of containers across dozens of machines, a problem you should be &lt;em&gt;lucky&lt;/em&gt; to have one day. Learn it when something actually forces you to, not because a roadmap puts it in a box.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Cloud Services (AWS, GCP, Azure).&lt;/strong&gt; This is &lt;em&gt;where&lt;/em&gt; "real" happens , somebody else's computer that's online 24/7. Pick &lt;strong&gt;one&lt;/strong&gt; provider (AWS has the most jobs, but they all rhyme) and learn the boring fundamentals: run a server, store some files, point a database at it. Ignore the other 200 services with the cryptic three-letter names. You'll meet them if and when you need them, and you mostly won't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 4 — Make it &lt;em&gt;survive&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Now people are actually using the thing, and "works" quietly turns into "works &lt;em&gt;slowly&lt;/em&gt;," then "falls over."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching (Redis, Memcached).&lt;/strong&gt; The fastest database query is the one you never run. Caching means storing the answer to expensive questions so you don't recompute them every single time. &lt;strong&gt;Redis&lt;/strong&gt; is the workhorse you'll reach for 95% of the time (&lt;strong&gt;Memcached&lt;/strong&gt; is the simpler, older cousin). The catch, and every cache has it: deciding &lt;em&gt;when to throw the stale answer away&lt;/em&gt; is the genuinely hard part. Serve someone yesterday's bank balance, and you'll find out fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Optimization (profiling, load balancing).&lt;/strong&gt; First rule: &lt;strong&gt;measure before you "optimize,"&lt;/strong&gt; because your gut is almost always wrong about what's slow. That's &lt;strong&gt;profiling&lt;/strong&gt;, actually looking at where the time goes instead of guessing. &lt;strong&gt;Load balancing&lt;/strong&gt; is splitting traffic across several copies of your app so no single one drowns. Beginners love to optimize a function that runs twice a day while ignoring the query firing ten thousand times a minute. Don't be that person. Find the real bottleneck, &lt;em&gt;then&lt;/em&gt; fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System Design (scalability, microservices).&lt;/strong&gt; This is the big-picture "how do all the pieces fit so this survives a million users" skill, and it's the one everyone wants to learn &lt;em&gt;first&lt;/em&gt; because it sounds impressive in interviews. Learn it &lt;em&gt;here&lt;/em&gt;, once the smaller pieces make sense, or it's just abstract box-drawing. And on &lt;strong&gt;microservices&lt;/strong&gt;: resist. Splitting your app into 23 tiny services because Netflix does is how a perfectly happy little app turns into a distributed nightmare that needs 40GB of RAM to boot on your laptop. Start with one well-organized app (a "monolith"). Split it only when a real, specific pain forces your hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Systems (consistency, replication).&lt;/strong&gt; The deep end, and genuinely hard, even seniors get humbled here. The instant your data lives in more than one place, you inherit brutal questions. &lt;strong&gt;Replication&lt;/strong&gt; is keeping copies of your data (for safety and speed); &lt;strong&gt;consistency&lt;/strong&gt; is the headache of those copies briefly &lt;em&gt;disagreeing&lt;/em&gt; with each other. You don't need this on day one. You need to know it &lt;em&gt;exists&lt;/em&gt;, so that when something impossible happens in production, you know the shape of the monster you're looking at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 5 — Make it &lt;em&gt;visible&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitoring (Prometheus, Grafana).&lt;/strong&gt; An app you can't see inside isn't an app, it's a liability with a login page. &lt;strong&gt;Prometheus&lt;/strong&gt; collects the numbers (how fast, how many errors, how much traffic); &lt;strong&gt;Grafana&lt;/strong&gt; draws them as dashboards you can actually read. Add logging early, &lt;em&gt;correlation IDs&lt;/em&gt; so you can trace one request through the whole system, and watch error rates and your slowest responses (the p99, not the average, averages cheerfully hide the pain). The goal is simple: find out your app is sick from a dashboard, not from an angry customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap on both ends
&lt;/h2&gt;

&lt;p&gt;Because this advice has a failure mode on each side, and I refuse to pretend it doesn't.&lt;/p&gt;

&lt;p&gt;Lean &lt;em&gt;too far&lt;/em&gt; into theory and you become the person who's watched 60 hours of system-design videos, can recite the CAP theorem in their sleep, and has never actually shipped a single endpoint a real human has touched. Infinite reading × zero building = zero.&lt;/p&gt;

&lt;p&gt;Lean &lt;em&gt;too far&lt;/em&gt; into building and you become the person who duct-tapes features together, never learns &lt;em&gt;why&lt;/em&gt; anything works, and hits a wall the moment something breaks in a way Stack Overflow hasn't pre-solved. Infinite vibes × zero fundamentals = a very confident developer who can't debug.&lt;/p&gt;

&lt;p&gt;The whole game is doing both: build real things, &lt;em&gt;and&lt;/em&gt; understand why they work. Suffer through the fundamentals a little, that's where the actual skill gets forged.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do tomorrow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick one language and stop shopping.&lt;/strong&gt; The one your local market hires for. Practice the one kick 10,000 times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build one tiny thing that's actually complete&lt;/strong&gt;, an API endpoint that talks to a database. That's Phase 1, and it's already a real, hireable skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then keep asking the next honest question:&lt;/strong&gt; &lt;em&gt;what breaks when a thousand strangers hit this at once?&lt;/em&gt; Security, then shipping, then speed, then scale, then visibility. The concepts show up in that order, every single time, you don't have to summon them all at once.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The roadmap with forty boxes isn't wrong. It's just drawn all at once, with no sense of &lt;em&gt;when&lt;/em&gt;, which is exactly why it terrifies beginners. Read it as a story instead. You don't learn the wall of nouns in one sitting,  you ship one honest endpoint, and let the next problem introduce you to the next concept.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>backend</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Do I Enjoy Doing Things I'm Not Great At?</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Fri, 03 Jul 2026 06:30:03 +0000</pubDate>
      <link>https://dev.to/towernter/why-do-i-enjoy-doing-things-im-not-great-at-46im</link>
      <guid>https://dev.to/towernter/why-do-i-enjoy-doing-things-im-not-great-at-46im</guid>
      <description>&lt;p&gt;If you ask what goes on in my head at 3 a.m., this is it. Cristiano is on TV doing his thing. Croatia is getting robbed. And somewhere in there, my brain starts thinking about why I suck at things that I enjoy doing?.&lt;/p&gt;

&lt;p&gt;Let me take you back a little. I write two kinds of articles. Technical ones, which come naturally to me. And the ones which I call business ones (well, the not-so-technical).&lt;/p&gt;

&lt;p&gt;I spend most of my time on the business articles. I enjoy writing them. I enjoy reading them back too. And just so you know, I'm not writing all these articles for you. I write to document things. Technical posts are usually just answers to questions people keep asking me. Instead of explaining the same thing again, I write it once and send the link. Someone once told me that the best way to really learn something is to teach it to someone else, or even just say it out loud to a wall (You should be doing the same; trust me, it helps). So this blog is my wall. Turns out my wall has people sitting on it. That's you.&lt;/p&gt;

&lt;p&gt;Anyway. Back to the real question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real question is about my own head
&lt;/h2&gt;

&lt;p&gt;I think "Why do I enjoy things I'm not great at" is the wrong way to say it. The better question is: &lt;strong&gt;why do I &lt;em&gt;think&lt;/em&gt; I enjoy things I'm not great at?&lt;/strong&gt; Because this whole idea lives in my head. And the stats page just proved me wrong.&lt;/p&gt;

&lt;p&gt;Here's what happened. I looked at the numbers on my published articles. I don't usually do this, because I write for myself, not for the numbers. But numbers don't lie. My technical articles get read a lot more than my business ones. And the business ones are the ones I enjoy writing the most.&lt;/p&gt;

&lt;p&gt;Maybe it's the people around me. Most of them are technical, so maybe the technical stuff feels more exciting to them. Fair enough. But that only explains the blog. It doesn't explain the rest of my life.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just about writing
&lt;/h2&gt;

&lt;p&gt;I like playing soccer. I'm honestly the last person you'd want on your team. I'm bad. I won't pretend otherwise. But do I enjoy playing? Yes. A lot. I also like running. I'm not fast at all. But I still love doing it.&lt;/p&gt;

&lt;p&gt;Put that next to the writing, and you can see the pattern. The things I'm &lt;em&gt;good&lt;/em&gt; at, like technical writing, get the attention. The things I &lt;em&gt;enjoy&lt;/em&gt;, like business writing, soccer, and running slowly, don't need attention to feel worth doing. I'd do them anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  So will I stop?
&lt;/h2&gt;

&lt;p&gt;You might be wondering. No, I won't. The Robert Mugabe in me doesn't care. If anything, I'll keep doing what I enjoy more than what people find impressive. The numbers can do whatever they want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does this happen to you too?
&lt;/h2&gt;

&lt;p&gt;So here's my question for you. Do you also enjoy things you're not good at? Do you keep doing them anyway, even when people notice your other skills more?&lt;/p&gt;

&lt;p&gt;Let me know in the comments.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>discuss</category>
      <category>watercooler</category>
      <category>writing</category>
    </item>
    <item>
      <title>Applied Creativity and Concept Generation - Brainstorming</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Thu, 02 Jul 2026 06:53:00 +0000</pubDate>
      <link>https://dev.to/towernter/applied-creativity-and-concept-generation-brainstorming-3ek2</link>
      <guid>https://dev.to/towernter/applied-creativity-and-concept-generation-brainstorming-3ek2</guid>
      <description>&lt;p&gt;Thomas Edison put it plainly: &lt;strong&gt;"To have a great idea, have a lot of them."&lt;/strong&gt; Steve Jobs said something similar. &lt;strong&gt;"Creativity is just having enough dots to connect... to connect experiences and to synthesise new things."&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Both of them are saying the same thing. Your first idea is rarely your best one.&lt;/p&gt;

&lt;p&gt;The reason why people you call creative can come up with great ideas easily is that they have had more experiences or have thought more about their experiences than other people. &lt;/p&gt;

&lt;p&gt;So the question becomes: how do you get more ideas, faster?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Used Method for Applied Creativity
&lt;/h2&gt;

&lt;p&gt;The answer has a name. It was coined by advertising executive Alex Osborn in the 1940s. He called it &lt;strong&gt;brainstorming&lt;/strong&gt; - using the brain to storm a creative problem, with each person in the room attacking the same objective.&lt;/p&gt;

&lt;p&gt;It sounds simple. Most teams think they already do it. Most of them are wrong.&lt;/p&gt;

&lt;p&gt;Real brainstorming is a structured process with rules. Break the rules, and you get something that looks like brainstorming but produces far fewer useful ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Most Brainstorming Sessions Fail
&lt;/h2&gt;

&lt;p&gt;Here is what kills a brainstorming session before it even starts.&lt;/p&gt;

&lt;p&gt;Someone says an idea. Someone else says, "That won't work." The room goes quiet. People stop sharing.&lt;/p&gt;

&lt;p&gt;That is it. That is the whole problem.&lt;/p&gt;

&lt;p&gt;When people fear judgment, they self-censor. They only say the safe, obvious ideas. The interesting ones, the ones that could actually lead somewhere, stay locked inside people's heads.&lt;/p&gt;

&lt;p&gt;Most teams have that one gaffer who has already decided which ideas are worth hearing before anyone has finished their sentence. Or the one who gives you the floor, listens patiently, and then quietly bins everything you said, not because it was bad, but because it was not theirs. Both types do the same damage. The room reads it. People stop sharing. And just like that, the best idea in the session never gets spoken. &lt;/p&gt;

&lt;p&gt;The goal of brainstorming is to get more ideas. That means the number one rule is: &lt;strong&gt;defer judgment&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rules That Actually Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Defer judgment of ideas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not evaluate while you generate. These are two different brain modes and they do not mix well. When someone shares an idea, your job is not to assess it. Your job is to write it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Build on the ideas of others&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of saying "that won't work," try asking "how could we make that even better?" This is sometimes called the "yes, and" rule. You take what someone gave you, and you add to it. The idea evolves into something neither person would have found alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Encourage wild ideas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one confuses people. Why would you encourage ideas that cannot possibly work?&lt;/p&gt;

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

&lt;p&gt;Because even a bad idea points somewhere useful, a wild idea might show you a direction you had not considered. Someone else in the room might hear it and think of a version that actually works. Wild ideas are not dead ends. They are arrows pointing at unexplored territory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Express ideas visually&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not just talk. Draw. Sketch. Make a rough model out of whatever is nearby. A sketch that takes thirty seconds can communicate something that would take five minutes to explain in words, and it gives the group something concrete to react to and build on.&lt;/p&gt;

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

&lt;p&gt;And do not stop at sketching. Build sketch models as early as possible. You do not need a finished prototype. Cardboard, foam, tape, anything that makes the idea three-dimensional. The moment something exists in physical form, even crudely, the conversation changes. People can point at it, hold it, and immediately see things that a drawing hides. The sooner you build it, the sooner you learn what is wrong with it and what is worth keeping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Stay focused on the topic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good ideas are everywhere once you start. The facilitator's job is to keep the group from drifting. One problem at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. One conversation at a time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Side conversations fracture the group's energy. When three people are talking at once, nobody is building on anyone else. The facilitator manages this. Everyone gets heard, one at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Use stimuli - related or unrelated to the topic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you need a jolt from outside the problem. A random image, an unrelated object, a word pulled out of the air. These force unexpected connections. Creativity is connecting dots, remember? More stimuli means more dots.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Set Up a Session That Actually Works
&lt;/h2&gt;

&lt;p&gt;The environment matters more than people think.&lt;/p&gt;

&lt;p&gt;A comfortable room. Four to eight people, small enough that everyone speaks, large enough to get diversity of thought. Paper and Post-its. Coloured markers. A whiteboard. Coffee and snacks, because people think better when they are relaxed.&lt;/p&gt;

&lt;p&gt;Give participants &lt;strong&gt;homework&lt;/strong&gt; before the session. Ask them to come with ideas already formed. This is not just a nice-to-have. Research shows that people generate more and better ideas when they think individually first, before being influenced by the group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Individuals First, Then the Group
&lt;/h2&gt;

&lt;p&gt;Here is the process that works.&lt;/p&gt;

&lt;p&gt;Start as individuals. Everyone works alone on the problem. They come up with ideas without hearing what everyone else is thinking. This builds a genuine variety of starting points, different approaches, different angles, and different assumptions about what the problem even is.&lt;/p&gt;

&lt;p&gt;Then come together as a group. Each person shares how they approached the problem. Not just the ideas, but the thinking behind them. This is where the magic happens. One person's framing unlocks a connection in someone else's mind. Ideas combine. They get refined. Something better emerges that nobody could have reached alone.&lt;/p&gt;

&lt;p&gt;The group goes from &lt;strong&gt;quantity and variety&lt;/strong&gt; to &lt;strong&gt;quality and refinement&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Research Actually Says
&lt;/h2&gt;

&lt;p&gt;Classic brainstorming has one famous rule: no criticism. But research from Charlan Nemeth at UC Berkeley suggests that allowing debate and even dissent actually produces &lt;em&gt;more&lt;/em&gt; ideas, not fewer.&lt;/p&gt;

&lt;p&gt;In a study across groups in France and the United States, participants were split into three conditions. The minimal condition gave people almost no guidance, just the problem. The brainstorming condition followed traditional rules: generate freely, defer judgment, and no criticism. The debate condition encouraged participants to argue, challenge, and push back on each other's ideas.&lt;/p&gt;

&lt;p&gt;The results were striking and went in one clear direction. The minimal condition produced the fewest ideas. The brainstorming condition produced more. But the debate condition produced the most, by a meaningful margin, and consistently across both countries.&lt;/p&gt;

&lt;p&gt;This does not mean you should tear ideas apart the moment they are spoken. It means healthy challenge, the kind that makes people think harder and explore further, is not the enemy of creativity. Groupthink is.&lt;/p&gt;

&lt;p&gt;The rule is not "never criticise." The rule is "never dismiss." There is a difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  That Being Said
&lt;/h2&gt;

&lt;p&gt;Brainstorming is a skill. Like any skill, it gets better with practice and worse when you ignore the fundamentals.&lt;/p&gt;

&lt;p&gt;If your team's sessions always produce the same three ideas, it is not because your team lacks creativity. It is because someone is killing ideas before they can breathe.&lt;/p&gt;

&lt;p&gt;Run the process properly. Start individually. Come together. Build on each other. Defer judgment, then apply it.&lt;/p&gt;

&lt;p&gt;The best idea in the room is almost never the first one out.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>design</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The German Tank Problem: Why You Need UUIDs</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Sun, 28 Jun 2026 17:44:35 +0000</pubDate>
      <link>https://dev.to/towernter/the-german-tank-problem-why-you-need-uuids-85p</link>
      <guid>https://dev.to/towernter/the-german-tank-problem-why-you-need-uuids-85p</guid>
      <description>&lt;p&gt;In World War II, the Allies had a very expensive question and no good way to answer it: &lt;strong&gt;how many tanks is Germany actually building?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The official method was spies, intercepted chatter, and educated guessing. The official method was also, as it turns out, wildly, embarrassingly wrong, intelligence estimates put German tank production at well over a thousand a month.&lt;/p&gt;

&lt;p&gt;Then some statisticians showed up and ruined everyone's mystique by doing arithmetic.&lt;/p&gt;

&lt;p&gt;See, the Germans were excellent engineers, which is another way of saying they were pathologically organized. Every tank rolled off the line with neatly sequential serial numbers stamped on the gearbox, the chassis, the road wheels, everything. And every time the Allies captured or destroyed a tank, those numbers got written down.&lt;/p&gt;

&lt;p&gt;So the statisticians stopped trying to &lt;em&gt;spy&lt;/em&gt; on the factories and started reading the &lt;strong&gt;serial numbers&lt;/strong&gt; of the wreckage. If you've captured a handful of tanks and the highest serial number you've seen is &lt;em&gt;m&lt;/em&gt;, and you've seen &lt;em&gt;k&lt;/em&gt; of them, then the total number produced is roughly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;N ≈ m + (m / k) − 1&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The intuition is beautiful and slightly evil: the biggest number you've seen tells you roughly how close you are to the top, and how many you've seen tells you how confident to be about that. The gaps between the serials you &lt;em&gt;do&lt;/em&gt; have tell you about the ones you &lt;em&gt;don't&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For one month in 1942, the spies said Germany was making around 1,500 tanks. The statisticians, armed with nothing but captured serial numbers and a formula, said &lt;strong&gt;327&lt;/strong&gt;. After the war, the actual German production records were recovered.&lt;/p&gt;

&lt;p&gt;The real number was &lt;strong&gt;342&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The spies missed by a thousand. The nerds missed by fifteen. Somewhere, a very smug statistician got a medal, and the lesson was carved into the bedrock of intelligence work forever:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sequential numbers leak.&lt;/strong&gt; If your serial numbers go 1, 2, 3, 4, anyone who sees a few of them can estimate how many of you exist.&lt;/p&gt;

&lt;p&gt;I think about this every single time I look at a URL that says &lt;code&gt;/users/1042&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your database is the German army
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable part. Almost every backend you've ever written is the Wehrmacht, cheerfully stamping sequential serial numbers on everything and then handing them to strangers.&lt;/p&gt;

&lt;p&gt;You spin up a Postgres table. The primary key is &lt;code&gt;id SERIAL&lt;/code&gt; — auto-incrementing integer, because of course it is, that's the default and it's beautiful and it sorts nicely. User 1 is you. User 2 is your co-founder. User 3 is your mom. Everything is fine.&lt;/p&gt;

&lt;p&gt;Then you build the profile page. The route is &lt;code&gt;/users/3&lt;/code&gt;. You ship it. You are now a German tank.&lt;/p&gt;

&lt;p&gt;Because here is what your competitor, or a bored teenager, or a journalist, or anyone with a browser, can now do. They sign up for your app today and get assigned &lt;code&gt;id = 4,317&lt;/code&gt;. They wait a week. They sign up again with a different email and get &lt;code&gt;id = 4,981&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Subtract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You got 664 signups this week.&lt;/strong&gt; They didn't breach anything. They didn't hack you. They read your serial numbers, exactly like the Allies read the gearboxes, and your growth rate fell out of the arithmetic. Your "we're crushing it, investors love us" pitch deck just got fact-checked by a stranger with two throwaway emails and the subtraction skills of a nine-year-old.&lt;/p&gt;

&lt;p&gt;It gets worse, because IDs leak more than &lt;em&gt;count&lt;/em&gt;. They leak &lt;em&gt;order&lt;/em&gt; and &lt;em&gt;time&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/invoices/58&lt;/code&gt; on launch day tells the world you have billed exactly 58 times in your company's entire existence.&lt;/li&gt;
&lt;li&gt;A support ticket numbered &lt;code&gt;#7&lt;/code&gt; tells your enterprise customer they are, uh, one of your first seven enterprise customers. Inspiring.&lt;/li&gt;
&lt;li&gt;Two orders placed a minute apart with IDs &lt;code&gt;9,000&lt;/code&gt; and &lt;code&gt;9,003&lt;/code&gt; tell a competitor you process roughly three orders a minute at peak.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there's the part the security people care about, which is that sequential IDs aren't just &lt;em&gt;informative&lt;/em&gt;, they're &lt;em&gt;guessable&lt;/em&gt;. If I can see &lt;code&gt;/api/orders/9000&lt;/code&gt;, I can also just... try &lt;code&gt;/api/orders/8999&lt;/code&gt;. And &lt;code&gt;8998&lt;/code&gt;. And if your authorization is even slightly lazy, and friend, it is I am now reading other people's orders. This has a name. It's called IDOR (Insecure Direct Object Reference), it's been in the OWASP Top 10 for approximately forever, and it is almost always born the moment someone exposes a sequential primary key to the outside world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the UUID, wearing a fake moustache
&lt;/h2&gt;

&lt;p&gt;The fix is to stop stamping your serial numbers in order. &lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;UUID&lt;/strong&gt; (Universally Unique Identifier) is a 128-bit value that, in its most common form (v4), is essentially random:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f47ac10b-58cc-4372-a567-0e02b2c3d479
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at that gorgeous nonsense. What's the previous user's ID? You have no idea. What's the next one? No idea. How many users exist? &lt;strong&gt;You cannot tell&lt;/strong&gt;, because there's no sequence to read, no maximum to anchor on, no gaps to measure. The German Tank Problem needs serial numbers in a row. A UUID is a serial number that fell into a wood chipper. The formula has nothing to bite on.&lt;/p&gt;

&lt;p&gt;As a bonus, and this is the part that wins over the people who don't care about counting attacks, UUIDs are &lt;em&gt;globally&lt;/em&gt; unique without coordination. Two different servers, two different services, an offline mobile client on a plane, can all generate IDs at the same time and never collide. No round-trip to the database to ask "what number am I allowed to use next?" You can generate the ID &lt;em&gt;before&lt;/em&gt; the row even exists. For anyone building distributed systems, that property alone is worth the price of admission.&lt;/p&gt;

&lt;p&gt;So: random, unguessable, count-hiding, coordination-free. We solved it. Ship it. Close the tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay, here's where I have to be the annoying friend
&lt;/h2&gt;

&lt;p&gt;Because this idea has a failure mode on each end, and I refuse to write a post that pretends UUIDs are free.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;They are not free.&lt;/strong&gt; A &lt;code&gt;bigint&lt;/code&gt; is 8 bytes. A UUID is 16, and if you store it as text like a maniac it's 36. Across a hundred-million-row table with a dozen foreign keys pointing at it, that overhead is not theoretical, it's your storage bill and your RAM.&lt;/p&gt;

&lt;p&gt;But the &lt;em&gt;real&lt;/em&gt; knife is the index. Your database stores its primary key in a B-tree, which is fastest and tidiest when new values arrive in roughly increasing order, every insert tucks neatly onto the end. A random UUIDv4 arrives like a drunk guest who sits &lt;em&gt;between&lt;/em&gt; two people at every table. The database has to constantly split pages, shuffle things around, and re-read cold parts of the index off disk. This is called write amplification and page fragmentation, and it's why someone, somewhere, migrated a high-traffic table to random UUIDs and watched their insert performance fall off a cliff and then wrote a furious blog post about it. (You will read that post right before making the same mistake. It's tradition.)&lt;/p&gt;

&lt;p&gt;So we did what engineers always do: we fixed the fix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UUIDv7&lt;/strong&gt; (standardized in 2024) puts a timestamp in the high bits and randomness in the low bits. So IDs trend upward over time — the B-tree is happy again, while still being unguessable and &lt;em&gt;uncountable&lt;/em&gt;. You can't subtract two of them to get a signup count. This is, for most apps, the correct default in 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ULIDs&lt;/strong&gt; do basically the same trick with a friendlier, sortable text encoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake IDs&lt;/strong&gt; (the Twitter classic) cram a timestamp, a machine ID, and a counter into a compact 64 bits — smaller and sortable, at the cost of leaking a little timing info.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But notice the catch, because it's the whole German Tank Problem sneaking back in the side door: &lt;strong&gt;a time-ordered ID still leaks the one thing it's ordered by, time.&lt;/strong&gt; UUIDv7 won't tell anyone your total user count, but it &lt;em&gt;will&lt;/em&gt; whisper roughly &lt;em&gt;when&lt;/em&gt; each record was created. That's a much smaller leak than "subtract for the growth rate," but it's not zero. If creation timestamps are sensitive in your domain, even v7 is a partial disrobing. Pick your poison on purpose.&lt;/p&gt;

&lt;p&gt;And the sneakiest trap of all: &lt;strong&gt;an unguessable ID is not an authorization system.&lt;/strong&gt; A UUID being hard to guess is not the same as a UUID being &lt;em&gt;protected&lt;/em&gt;. If your only defense against me reading someone else's invoice is "well, they'd have to guess a 122-bit random number," you have built a password and called it an ID. UUIDs slam the door on &lt;em&gt;enumeration&lt;/em&gt;. They do absolutely nothing if you forget to check whether the person holding the ID is actually allowed to use it. Check your authz. The random ID is the lock; the auth check is the guard. You need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do tomorrow
&lt;/h2&gt;

&lt;p&gt;You can't un-stamp the serial numbers on a system you've already shipped, but you fully control two dials, so go set them on purpose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stop exposing your primary key.&lt;/strong&gt; The cleanest move on most teams: keep a boring auto-increment &lt;code&gt;bigint&lt;/code&gt; as the &lt;em&gt;internal&lt;/em&gt; primary key (your indexes stay fast, your joins stay cheap) and add a &lt;em&gt;separate&lt;/em&gt; random external ID — a UUIDv7 — for anything the outside world ever sees. URLs, API responses, invoice numbers. The fast key stays in the basement; the wood-chipper key goes out front.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Default new public-facing IDs to UUIDv7, not v4.&lt;/strong&gt; You get the count-hiding without setting your write performance on fire. Reach for v4 only when you specifically &lt;em&gt;want&lt;/em&gt; zero time signal and don't care about index locality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Then check your authorization anyway&lt;/strong&gt;, because the ID was never the security boundary. It just stops people from reading you like a captured gearbox.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Allies won that particular round of the war with a formula and a pile of serial numbers, because the other side was tidy enough to number everything in order and careless enough to let those numbers be seen.&lt;/p&gt;

&lt;p&gt;Don't be tidy where it counts against you. Number your tanks at random.&lt;/p&gt;

&lt;p&gt;The statisticians are still out there. They are still very smug. And the next time someone signs up for your app twice in a week just to subtract the IDs, you get to be the insufferable person who already shipped UUIDv7, and is, annoyingly, fine.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>DESIGN THINKING SKILLS: What Makes Designers Successful?</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Mon, 22 Jun 2026 06:26:00 +0000</pubDate>
      <link>https://dev.to/towernter/design-thinking-skills-what-makes-designers-successful-1558</link>
      <guid>https://dev.to/towernter/design-thinking-skills-what-makes-designers-successful-1558</guid>
      <description>&lt;p&gt;People who make great products or services share certain skills. It is not a fancy qualification. It is not natural talent. It is a simple way of thinking called &lt;strong&gt;Design Thinking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is important to identify these skills so that we can also pick them up.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Why Can't We Just Wing It?
&lt;/h2&gt;

&lt;p&gt;"Why not just build the thing and fix problems later?" A lot of teams do this. Most of them end up with a product that nobody uses.&lt;/p&gt;

&lt;p&gt;The difference between a product people love and one that nobody touches is simple. The winning team actually understood the people they were building for. The losing team just guessed.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Is Design Thinking?
&lt;/h2&gt;

&lt;p&gt;Design thinking is a way of solving problems that does two things:&lt;/p&gt;

&lt;p&gt;It puts the &lt;strong&gt;user first&lt;/strong&gt;, you think about the real people who will use your product, not just your own ideas about them.&lt;/p&gt;

&lt;p&gt;It focuses on &lt;strong&gt;solutions&lt;/strong&gt;, instead of spending all your time talking about what is wrong, you spend your time building what could be right. I know this is hard. The normal human instinct when something breaks is to find the person responsible and make it their problem. Design thinking says that is a waste of everyone's time. Find the fix instead.&lt;/p&gt;

&lt;p&gt;For example. A company notices its staff avoid using the new internal system. The old way is to scream at employees, threaten them with warnings, make them write reports, or send the classic "please refer to the training manual" email that nobody reads. The design thinking way is to sit with employees, watch them use the system, and find out the main button is hidden on the wrong page. Then you move the button. Simple solution. Real impact.&lt;/p&gt;

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

&lt;p&gt;The thing that makes all of this work is &lt;strong&gt;empathy&lt;/strong&gt;. This means you genuinely care about how other people feel and what they go through. Without this, you are just building things for yourself and hoping others like them.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Design Thinking Framework
&lt;/h2&gt;

&lt;p&gt;The design thinking process can be broken down into three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explore&lt;/li&gt;
&lt;li&gt;Create&lt;/li&gt;
&lt;li&gt;Implement&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h3&gt;
  
  
  1. Explore — Go and See
&lt;/h3&gt;

&lt;p&gt;This is the step most people skip. It is also the most important one.&lt;/p&gt;

&lt;p&gt;Before you build anything, go talk to real people. Watch how they do things today. Ask questions. Listen more than you talk. Ask "why" again and again until you find the real problem hiding under the surface.&lt;/p&gt;

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

&lt;p&gt;You are not trying to prove your idea is right. You are trying to learn something that surprises you. If nothing surprises you, you have not talked to enough people.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create — Try Many Ideas
&lt;/h3&gt;

&lt;p&gt;Most people think this is where design thinking starts. It is not. But this is where the fun begins.&lt;/p&gt;

&lt;p&gt;First, write down every idea you have. Even the silly ones. Linus Pauling said the way to get good ideas is to get lots of ideas and throw the bad ones away. So write them all down first.&lt;/p&gt;

&lt;p&gt;Then, pick your best ideas and build a rough version of each one. This is called a &lt;strong&gt;prototype&lt;/strong&gt;. It does not have to look good. It just has to be something a real person can try.&lt;/p&gt;

&lt;p&gt;A paper drawing is fine. A simple clickable screen is fine. Anything that lets a real human say "I like this" or "this does not make sense" is good enough. As Reid Hoffman said, "If you are not embarrassed by the first version of your product, you've launched too late." You are not trying to get it perfect. You are trying to get feedback fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Implement — Ship It and Keep Learning
&lt;/h3&gt;

&lt;p&gt;When you finally launch, the work is not done. Watch how people actually use what you built. It will surprise you. Take what you learn and go back to step one.&lt;/p&gt;

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

&lt;p&gt;The best teams never really stop exploring. Every version they ship teaches them something for the next one.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t1vhk1q6ohqelbiunz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t1vhk1q6ohqelbiunz7.png" alt=" " width="640" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Not Just for Designers
&lt;/h2&gt;

&lt;p&gt;Design thinking is not about colours and fonts. Anyone can use it. A nurse, a teacher, a software developer, a shop owner, if you solve problems for other people, this way of thinking is for you.&lt;/p&gt;

&lt;p&gt;The skills are simple: be curious, care about people, try many ideas before picking one, and test before you polish.&lt;/p&gt;

&lt;p&gt;Start practising them today. Next time you face a hard problem, do not sit and stare at it. Go talk to the person who has the problem. Build the simplest possible answer. Then learn from what happens.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>design</category>
      <category>product</category>
      <category>ux</category>
    </item>
    <item>
      <title>Is Your AI Assistant Making You a Better Developer, or Just a Faster One?</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Fri, 19 Jun 2026 10:57:48 +0000</pubDate>
      <link>https://dev.to/towernter/is-your-ai-assistant-making-you-a-better-developer-or-just-a-faster-one-19o8</link>
      <guid>https://dev.to/towernter/is-your-ai-assistant-making-you-a-better-developer-or-just-a-faster-one-19o8</guid>
      <description>&lt;p&gt;It's 11 pm. You have been staring at the same bug for three hours. You are tired. You give the whole thing to Codex or Claude and say, "Just fix this".&lt;br&gt;
It gives you a solution. Tests pass. You commit and go to bed.&lt;/p&gt;

&lt;p&gt;Did you understand what just fixed your bug?&lt;/p&gt;

&lt;p&gt;I have done this, and I am sure most of us have. For me, the problem is not using AI to get unstuck. The problem is that when you do it so often, you stop being able to get yourself unstuck. I am afraid of a situation where one day, you are in an interview, or an outage, or a code review, and there is no AI.&lt;/p&gt;

&lt;p&gt;I would also like to assume that for most people, AI handles the boring parts, and you get to focus on the hard thinking, meaning you ship better work in less time. That is real, and it is great.&lt;/p&gt;

&lt;p&gt;But there is another version where you are just getting faster at not learning anything.&lt;/p&gt;

&lt;p&gt;What do you think? &lt;em&gt;Is Your AI Assistant Making You a Better Developer, or Just a Faster One?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Luck == Opportunity Meets Preparation</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Tue, 16 Jun 2026 12:32:41 +0000</pubDate>
      <link>https://dev.to/towernter/luck-opportunity-meets-preparation-58g9</link>
      <guid>https://dev.to/towernter/luck-opportunity-meets-preparation-58g9</guid>
      <description>&lt;p&gt;There's a line usually pinned on the Roman philosopher Seneca: &lt;em&gt;luck is what happens when preparation meets opportunity.&lt;/em&gt; People put it all over social media and like most things on social media, it gets repeated so often that it stops meaning anything.&lt;/p&gt;

&lt;p&gt;So let me try to make it mean something again, with a math equation and a football match that happened recently at the latest FIFA World Cup 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The equation nobody writes down
&lt;/h2&gt;

&lt;p&gt;We talk about luck like it's a single mysterious force, either you have it or you don't. But it's not one thing. It's two things multiplied together:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Luck = Preparation × Opportunities&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Look at what that multiplication does. If your preparation is zero, it doesn't matter how many opportunities show up, zero times anything is still zero. And if you're the most prepared person alive but you never put yourself in front of a single opportunity, same result. Zero.&lt;/p&gt;

&lt;p&gt;The lucky people aren't the ones who got &lt;em&gt;more&lt;/em&gt; luck handed to them. They're the ones who kept both numbers high. They got good &lt;em&gt;and&lt;/em&gt; they kept showing up to the table where things happen.&lt;/p&gt;

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

&lt;p&gt;Hold that thought. Let's go to Texas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Japan, the Netherlands, and the 88th minute
&lt;/h2&gt;

&lt;p&gt;On June 14th, 2026, Japan played the Netherlands in their World Cup group opener in Arlington, Texas. On paper it was a mismatch in the most literal, physical sense.&lt;/p&gt;

&lt;p&gt;The Netherlands are &lt;em&gt;tall&lt;/em&gt;. Van Dijk, Van de Ven, the whole spine of that team is built like a row of wardrobes. Japan are one of the shorter sides in world football, quick, technical, but not the people you'd bet on to win a header. If you were designing a contest specifically to humiliate the Japanese, you'd make it about jumping.&lt;/p&gt;

&lt;p&gt;And for most of the night, the script ran exactly as the bodies predicted. The Dutch dominated the run of play, around 60% possession, more passes, more touches in the box, the better expected goals. Van Dijk, a defender, rose for a cross and headed the Netherlands ahead. Later Summerville restored their lead. The Oranje even won the aerial duels comfortably, around 74% of them. The taller, richer, more fancied team was doing exactly what everyone assumed it would.&lt;/p&gt;

&lt;p&gt;Then the 89th minute happened. A ball was worked into the box, Koki Ogawa rose at the back of it, and the move ended with Daichi Kamada finishing past a flailing Dutch keeper. 2-2. A point stolen, against giants, right at the death.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nhsw36iux8gqlzcm1pc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nhsw36iux8gqlzcm1pc.png" alt="The Nertherlands vs Japan" width="799" height="525"&gt;&lt;/a&gt;&lt;br&gt;
(Credit: FIFA)&lt;/p&gt;

&lt;p&gt;Now a fun stat that flips the whole story, and the reason this match is actually &lt;em&gt;perfect&lt;/em&gt; for what we're about to talk about. You'd assume the dominant Dutch were the ones bombarding the box with crosses. They weren't. &lt;strong&gt;Japan attempted more crosses than the Netherlands, 23 to 21.&lt;/strong&gt; The team that was second-best on possession, second-best on xG, and &lt;em&gt;losing the aerial battle&lt;/em&gt; just kept whipping balls into the box anyway, over and over, especially once the subs came on. Most of those crosses went nowhere. And then, in the 89th minute, one of them finally found a head.&lt;/p&gt;

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

&lt;p&gt;So both halves of the truth are true at once, which is what makes it a great story:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They raised their opportunities by crossing it 23 times, and their preparation cashed the one that landed.&lt;/strong&gt; A team that kept firing balls in long after it looked hopeless, that had drilled what to do when one finally dropped, that hadn't mentally checked out at 2-1 down, that team converted the half-second the universe finally handed them. The volume created the chance; the preparation finished it.&lt;/p&gt;

&lt;p&gt;That's the whole equation in one match. &lt;strong&gt;Luck = Preparation × Opportunities.&lt;/strong&gt; Japan cranked &lt;em&gt;both&lt;/em&gt; dials, more attempts &lt;em&gt;and&lt;/em&gt; the readiness to punish one, and stole a point from a team that, on every other number, beat them.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Life is a game of numbers" — the other half
&lt;/h2&gt;

&lt;p&gt;Okay, but sometimes you &lt;em&gt;don't&lt;/em&gt; have elite preparation yet. Sometimes you're just starting. What then?&lt;/p&gt;

&lt;p&gt;Then you turn the other dial: &lt;strong&gt;opportunities.&lt;/strong&gt; You take more shots.&lt;/p&gt;

&lt;p&gt;Japan's 23 crosses are a tiny, 90-minute version of this. Stretch the same idea across &lt;em&gt;years&lt;/em&gt; and you get the tech world, a graveyard-slash-trophy-room of people who simply refused to stop attempting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WD-40&lt;/strong&gt; — the spray in half the garages on earth, literally means &lt;em&gt;"Water Displacement, 40th attempt."&lt;/em&gt; The first thirty-nine formulas failed. Somebody had the patience to label their failures honestly and keep going.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;James Dyson&lt;/strong&gt; built &lt;strong&gt;5,127 prototypes&lt;/strong&gt; of his bagless vacuum before one worked. Five thousand one hundred and twenty-seven. Read that again. He was &lt;em&gt;wrong&lt;/em&gt; 5,126 times in a row, which by any normal emotional standard is a reason to take up gardening instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angry Birds&lt;/strong&gt; was Rovio's &lt;strong&gt;52nd game.&lt;/strong&gt; They spent years nearly going bankrupt making 51 things you have never heard of and never will. Game number 52 is the one your aunt has on her phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are "luck" in the lottery sense. They're the equation again, just weighted the other way: when each individual attempt has a low chance of landing, you survive by taking &lt;em&gt;more attempts.&lt;/em&gt; You buy more lottery tickets in a lottery where skill stacks the odds in your favour over time.&lt;/p&gt;

&lt;p&gt;You miss 100% of the shots you don't take. But here's the part the motivational poster leaves off: &lt;strong&gt;you also miss most of the shots you do take.&lt;/strong&gt; That's fine. The whole point is to take enough of them, while getting good enough at them, that the misses become statistically survivable.&lt;/p&gt;

&lt;h2&gt;
  
  
  "A moving man will surely meet his luck"
&lt;/h2&gt;

&lt;p&gt;This is the line doing laps around the internet right now, and it's basically our equation crushed down into seven words. &lt;em&gt;A moving man will surely meet his luck.&lt;/em&gt; It's everywhere, football captions. It spreads because it's true in a very specific, almost boring way: &lt;strong&gt;luck travels along roads, and you have to be on the road to get hit by it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Luck cannot find you in your room. It does not have your home address. It finds you in the meeting you showed up to, the project you actually shipped, the conference you flew to, the cold message you sent, the game you released even though it was your 52nd one. The moving man isn't lucky because the universe likes him. He's lucky because he keeps wandering into the places where luck is standing around looking for someone to bump into.&lt;/p&gt;

&lt;p&gt;My favourite proof is Stewart Butterfield, a man so committed to moving that the universe basically had to pay him twice to make him stop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;He set out to build an online game called &lt;em&gt;Game Neverending.&lt;/em&gt; The game flopped. But the little photo-sharing tool his team had built inside it became &lt;strong&gt;Flickr&lt;/strong&gt;, which Yahoo bought.&lt;/li&gt;
&lt;li&gt;Did he learn his lesson and sit still? Of course not. He went and built &lt;em&gt;another&lt;/em&gt; game, &lt;em&gt;Glitch.&lt;/em&gt; That one also flopped. But the internal chat tool his team had cobbled together just to talk to each other became &lt;strong&gt;Slack&lt;/strong&gt; — which Salesforce later bought for around &lt;strong&gt;$27.7 billion.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Twice he aimed at a target and missed. Twice the &lt;em&gt;act of moving&lt;/em&gt; building, shipping, keeping a team in motion, produced the thing that actually mattered, sitting quietly in the corner of his failure. Same energy with Instagram, which started life as a clunky check-in app called &lt;em&gt;Burbn&lt;/em&gt; until the founders noticed the only feature anyone used was the photos.&lt;/p&gt;

&lt;p&gt;None of these people knew which attempt would land. That's the entire point, you don't get to know. You just keep moving, so that when luck finally comes down the road, you are, in fact, &lt;em&gt;on the road.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech hall of accidental fame
&lt;/h2&gt;

&lt;p&gt;Honestly, once you pull this thread, you realise a frankly embarrassing chunk of Silicon Valley is just people who completely failed at their original plan and tripped face-first into a better one. The "visionary founder who knew exactly what they were building" is mostly a story told afterwards, on a podcast, by someone who got lucky and is too polite to admit it.&lt;/p&gt;

&lt;p&gt;A quick tour of the graveyard-slash-billionaire-factory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;YouTube was a dating site.&lt;/strong&gt; The founders registered the domain on &lt;em&gt;Valentine's Day,&lt;/em&gt; slapped on the slogan "Tune In, Hook Up," and literally offered women $20 on Craigslist to upload dating videos. Number of videos uploaded: zero. Romance dead, they shrugged, said &lt;em&gt;fine, upload literally anything,&lt;/em&gt; and accidentally built the second-biggest website on Earth. The first-ever video was a guy standing at a zoo talking about elephants. Swoon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Twitter fell out of a podcasting startup.&lt;/strong&gt; It was born inside &lt;em&gt;Odeo&lt;/em&gt;, right as Apple casually rolled iTunes podcasts over the entire industry like a steamroller over a grape. Staring down certain death, the team ran a hackathon, and the dumb little "post what you're doing right now" side-project ate its own parent company. Odeo died so your uncle could argue with strangers about football at 2am.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PayPal was an app for beaming money between Palm Pilots.&lt;/strong&gt; Yes, the device. Two people had to point their PDAs at each other like wizards casting a spell to send $5. Shockingly, the world did not want to do this. So they tried "what if email, but it's money," and a fintech giant fell out of the side of the failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nintendo — the Mario people, sold playing cards for ~70 years.&lt;/strong&gt; Before video games, they also tried running a taxi company and, this is genuinely real, &lt;em&gt;a chain of love hotels.&lt;/em&gt; The path from hourly-rate rooms to &lt;em&gt;The Legend of Zelda&lt;/em&gt; is not a straight line. Nobody's is.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And my personal favourite, pure cosmic comedy: &lt;strong&gt;Brian Acton.&lt;/strong&gt; In 2009 he applied for a job at Twitter and got rejected. Then he applied at Facebook and got rejected &lt;em&gt;there too.&lt;/em&gt; His reaction, posted publicly: &lt;em&gt;got denied by Twitter HQ, that's ok, would've been a long commute.&lt;/em&gt; He then went and co-founded WhatsApp, which &lt;strong&gt;Facebook bought five years later for $19 billion.&lt;/strong&gt; The company that wouldn't hire him paid nineteen &lt;em&gt;billion&lt;/em&gt; dollars for the thing he built &lt;em&gt;because&lt;/em&gt; they wouldn't hire him. The man got rejected directly into a yacht. If that isn't "a moving man meets his luck," nothing is.&lt;/p&gt;

&lt;p&gt;The pattern under all the jokes is the exact same boring, beautiful equation. None of them knew which attempt would hit. They just kept building, kept shipping, kept pointing Palm Pilots at each other, until something, almost never the thing they were aiming at, finally connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap on both sides
&lt;/h2&gt;

&lt;p&gt;Here's where I have to be the annoying friend, because this idea has a failure mode on each end.&lt;/p&gt;

&lt;p&gt;Crank &lt;em&gt;only&lt;/em&gt; preparation and never ship, and you become the person with the perfect, polished, fully-architected app that has zero users because you never put it in front of a single human. Infinite preparation × zero opportunities = zero. You studied for a test you never showed up to.&lt;/p&gt;

&lt;p&gt;Crank &lt;em&gt;only&lt;/em&gt; volume and skip the preparation, and you become the person who sends 500 lazy job applications, builds 50 half-finished side projects, and pitches the same unbaked idea to everyone, and concludes the world is just unfair when none of it lands. Infinite attempts × near-zero preparation ≈ still basically zero, just louder.&lt;/p&gt;

&lt;p&gt;And one more, the sneakiest: don't mistake &lt;strong&gt;a survivor's story for a recipe.&lt;/strong&gt; For every Dyson who attempted 5,127 times and won, there are people who attempted 5,127 times at the &lt;em&gt;wrong thing&lt;/em&gt; and quietly went broke, they just don't get a keynote. The equation isn't "suffer long enough and you're owed a win." It's "you control two inputs, your skill and your number of swings, and you &lt;em&gt;cannot&lt;/em&gt; control the roll of the dice in between." Stack the inputs. Respect the dice.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you actually do tomorrow
&lt;/h2&gt;

&lt;p&gt;You can't manufacture luck. But luck is the &lt;em&gt;product&lt;/em&gt; of two numbers you fully control, so go raise both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get genuinely good at one thing&lt;/strong&gt; — that's your multiplier. Skill is what converts a half-chance into a goal in the 88th minute. Suffer through the reps now so that when the ball comes in, your head's already in the right place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put yourself in front of more chances&lt;/strong&gt; — ship the project, send the message, enter the competition, publish the article you've been sitting on. Every swing is another roll where your preparation gets to &lt;em&gt;do something.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do both, long enough, and one day something will land and somebody will call you lucky. Smile and let them. You'll know it wasn't luck that showed up, it was you, prepared, standing exactly where the ball was always going to drop.&lt;/p&gt;

&lt;p&gt;The short team can out-jump the giants. But only the one that practised the jump.&lt;/p&gt;

&lt;p&gt;Now go take your shot. Preferably your 52nd one.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
      <category>analytics</category>
    </item>
    <item>
      <title>A Love Letter to Survivorship Bias in Tech</title>
      <dc:creator>Tawanda Nyahuye</dc:creator>
      <pubDate>Tue, 16 Jun 2026 09:32:49 +0000</pubDate>
      <link>https://dev.to/towernter/a-love-letter-to-survivorship-bias-in-tech-kfa</link>
      <guid>https://dev.to/towernter/a-love-letter-to-survivorship-bias-in-tech-kfa</guid>
      <description>&lt;p&gt;How many times have you seen a picture of a plane with red dots posted on the internet without context?&lt;/p&gt;

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

&lt;p&gt;There's a famous story about a statistician named Abraham Wald and a bunch of WWII bombers. The military looked at the planes coming back from combat, mapped where they were riddled with bullet holes, and decided to add armor there. Wald, being the kind of person who ruins meetings by being right, pointed out the obvious thing nobody wanted to hear:&lt;/p&gt;

&lt;p&gt;The planes they were looking at &lt;em&gt;came back&lt;/em&gt;. The ones hit in the spots with no bullet holes, the engine, the cockpit, were at the bottom of the English Channel, not available for the survey.&lt;/p&gt;

&lt;p&gt;Reinforce the parts that &lt;em&gt;aren't&lt;/em&gt; shot up. That's where the dead planes got hit.&lt;/p&gt;

&lt;p&gt;I think about this story a lot, mostly while reading those blog posts titled "X Habits That Made Me a 10x Engineer."&lt;/p&gt;

&lt;h2&gt;
  
  
  The entire industry is a returning-plane survey
&lt;/h2&gt;

&lt;p&gt;Here is the uncomfortable thing about software engineering wisdom: almost all of it is collected from the planes that came back.&lt;/p&gt;

&lt;p&gt;Successful companies write blog posts. Successful founders do podcast tours. Successful engineers give conference talks with titles like "Scaling to 100 Million Users with Three People and a Dream." The companies that did the &lt;em&gt;exact same things&lt;/em&gt; and died do not have a booth at the conference. They are not on the panel. They are in the channel, with the engines.&lt;/p&gt;

&lt;p&gt;And yet we keep doing the survey. We stare at the bullet holes on the survivors and go, "Ah, &lt;em&gt;this&lt;/em&gt; is where we add armor."&lt;/p&gt;

&lt;h2&gt;
  
  
  "Netflix uses microservices, so we should too"
&lt;/h2&gt;

&lt;p&gt;You have eleven users. Three of them are your co-founders, and one is your mom.&lt;/p&gt;

&lt;p&gt;Netflix runs a globe-spanning streaming empire on hundreds of microservices because they have hundreds of teams, billions in revenue, and problems you will be lucky to have in a decade. You have a Postgres database that is doing just fine, thank you, and a monolith that boots in four seconds.&lt;/p&gt;

&lt;p&gt;So naturally, you spend the next eight months splitting your perfectly functional app into 23 microservices, introducing a message queue you don't understand, adding a service mesh to manage the services you didn't need, and now your local dev environment requires 40GB of RAM and a small prayer.&lt;/p&gt;

&lt;p&gt;You did what Netflix does! And you will &lt;em&gt;also&lt;/em&gt; do what most companies that copied Netflix did, which is quietly migrate back to a monolith in two years and write a blog post about it called "Why We Moved Back to a Monolith." That post will be very popular. It will be read by people who are about to make the same mistake and will not be dissuaded.&lt;/p&gt;

&lt;p&gt;The bullet holes are on the survivors. The armor goes where the holes &lt;em&gt;aren't&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  "All our best engineers skipped college"
&lt;/h2&gt;

&lt;p&gt;Survivorship bias loves a hiring anecdote.&lt;/p&gt;

&lt;p&gt;"Our best people are self-taught, never finished a CS degree, just shipped." Cool. You are describing the four self-taught people &lt;em&gt;you hired and kept.&lt;/em&gt; You are not describing the enormous pool of self-taught applicants you rejected, or the ones who flamed out in month two, or the entire category of people who never applied because the job post wanted "10 years of Kubernetes experience" for a technology that is nine years old.&lt;/p&gt;

&lt;p&gt;You hired survivors and then concluded that being a survivor is a great predictor of survival. Groundbreaking.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  "They don't build software like they used to"
&lt;/h2&gt;

&lt;p&gt;Ah, yes, the legendary robustness of old software. That COBOL system from 1987 that still keeps that one giant corporation afloat. They really knew how to build things back then.&lt;/p&gt;

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

&lt;p&gt;Friend. That COBOL system is the &lt;em&gt;survivor.&lt;/em&gt; It is one plane. The skies of 1987 were &lt;em&gt;thick&lt;/em&gt; with garbage software that crashed, got cancelled, lost its company, and was mercifully deleted before you were born. Nobody's writing "we don't make 'em like we used to" think-pieces about &lt;code&gt;PayrollSystem_FINAL_v3_actuallyfinal.exe&lt;/code&gt; because it was put out of its misery in 1991.&lt;/p&gt;

&lt;p&gt;We remember old software fondly for the same reason we remember the planes that landed: the other ones aren't here to interview.&lt;/p&gt;

&lt;h2&gt;
  
  
  The advice that is secretly just luck wearing a hoodie
&lt;/h2&gt;

&lt;p&gt;The most dangerous survivorship bias is the confident first-person retrospective. It goes like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I never wrote tests. I never used a debugger. I just shipped fast and trusted my gut. And look where I am now."&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Yes. Look where you are. You are &lt;em&gt;one data point&lt;/em&gt; who happens to be holding a microphone. For every you, there is a graveyard of developers who &lt;em&gt;also&lt;/em&gt; never wrote tests, &lt;em&gt;also&lt;/em&gt; shipped on vibes, and are now explaining to a very calm room why prod has been down for six hours. They are not at this conference. They are in a Slack channel called &lt;code&gt;#incident-2024&lt;/code&gt; that will never be archived.&lt;/p&gt;

&lt;p&gt;The gut-trusting works great right up until it doesn't, and the "doesn't" is invisible because it doesn't get a keynote.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually not be the dumb general
&lt;/h2&gt;

&lt;p&gt;The fix is the whole point of the Wald story, and it's deceptively simple: &lt;strong&gt;go looking for the missing planes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When someone tells you, "Do X, it's why we won," ask the question nobody at the survey wanted to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How many teams did X and lost?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the trait shows up just as often in the wreckage as in the winners, it didn't cause the winning. Microservices, rewriting in Rust, a four-hour daily standup, unlimited PTO, "we don't do meetings" — run them all through the same filter. The survivors will tell you their habits caused their success. The dead can't tell you their identical habits caused nothing of the sort.&lt;/p&gt;

&lt;p&gt;This is why post-mortems are worth more than success stories. A blameless write-up of how something &lt;em&gt;failed&lt;/em&gt; is one of the rare documents written from inside the wreckage. It's a transmission from a plane that didn't come back, which makes it the only useful data on the whole map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Please add the armor where the holes aren't
&lt;/h2&gt;

&lt;p&gt;So go forth. Read the FAANG engineering blog. Admire the architecture diagram with 200 boxes. Feel the pull to adopt all of it.&lt;/p&gt;

&lt;p&gt;Then remember that you are surveying returning planes, close the tab, and go ship the boring monolith that your eleven users will actually be served by.&lt;/p&gt;

&lt;p&gt;The bullet holes are a trap. The survivors are a biased sample. And the next time someone says "we should do it like Google," you get to be the insufferable person in the meeting who is, annoyingly, correct.&lt;/p&gt;

&lt;p&gt;Wald would be proud. Wald would also tell you to write tests.&lt;/p&gt;

</description>
      <category>career</category>
      <category>software</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
