<?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: Hansel Wei</title>
    <description>The latest articles on DEV Community by Hansel Wei (@hansel).</description>
    <link>https://dev.to/hansel</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%2F258934%2F3b133b77-d751-48dc-b983-ac2ffe3f4b0c.jpeg</url>
      <title>DEV Community: Hansel Wei</title>
      <link>https://dev.to/hansel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hansel"/>
    <language>en</language>
    <item>
      <title>Black October Is a Good Reason to Finally Use Passkeys and 2FA</title>
      <dc:creator>Hansel Wei</dc:creator>
      <pubDate>Mon, 26 Oct 2026 02:00:54 +0000</pubDate>
      <link>https://dev.to/hansel/black-october-is-a-good-reason-to-finally-use-passkeys-and-2fa-303j</link>
      <guid>https://dev.to/hansel/black-october-is-a-good-reason-to-finally-use-passkeys-and-2fa-303j</guid>
      <description>&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;October 2026 has been nicknamed "Black October" in infosec because of several major incidents and vulnerability disclosures. The headline items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PHP2Shell:&lt;/strong&gt; two critical PHP vulnerabilities, &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-109618" rel="noopener noreferrer"&gt;CVE-2026-109618&lt;/a&gt; and &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-109619" rel="noopener noreferrer"&gt;CVE-2026-109619&lt;/a&gt;, reported October 21, affecting a language that powers roughly 70% of websites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM supply-chain attack:&lt;/strong&gt; the project's release infrastructure was compromised on October 21, and poisoned PyPI packages were live for under two hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;eMudhra:&lt;/strong&gt; a researcher reported that private keys for eight intermediate CA certificates were cryptographically weak, so fraudulent certificates could be forged. Literally used the number &lt;code&gt;4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password interception:&lt;/strong&gt; attackers used 333 compromised Tor exit relays starting October 2 to redirect SSH connections to interception servers and steal passwords.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where passkeys fit (and where they don't)
&lt;/h2&gt;

&lt;p&gt;A passkey won't patch your PHP runtime or stop a poisoned package. If your takeaway is "enable passkeys and I'm safe," stop reading and go patch.&lt;/p&gt;

&lt;p&gt;What passkeys do is take away a whole class of attack that keeps feeding incidents like these: &lt;strong&gt;stolen, phished, and replayed passwords.&lt;/strong&gt; A passkey is a per-site key pair. The private key stays on your device, and the server only stores a public key. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A server-side breach leaks nothing an attacker can log in with.&lt;/li&gt;
&lt;li&gt;A phishing page can't harvest a credential that is bound to the real domain.&lt;/li&gt;
&lt;li&gt;There's nothing to type into an interception server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're also easier to use. The FIDO Alliance's 2026 index found 36% of successful sign-ins now use a passkey, with a 93% success rate versus 78% for passwords and traditional MFA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passkeys vs. SMS 2FA
&lt;/h2&gt;

&lt;p&gt;"But I already have 2FA." Good, keep it. But not all 2FA is equal, and the weakest common version is the text message code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why phone-based 2FA falls short&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SIM swapping:&lt;/strong&gt; an attacker persuades your carrier to move your number to their SIM, and your codes now go to them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interception:&lt;/strong&gt; texts aren't end-to-end encrypted, and telecom-level weaknesses (like SS7 abuse) can expose them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time phishing:&lt;/strong&gt; a fake login page asks for your password, then your code, and relays both to the real site instantly. The code is valid and fresh, so it works. This is the most common failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malware:&lt;/strong&gt; anything that can read your messages or notifications can read the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push fatigue:&lt;/strong&gt; attackers spam approval prompts until someone taps "yes."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The root problem is that a six-digit code is just text. You can type it anywhere, including into the wrong site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why passkeys are harder to attack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Origin binding:&lt;/strong&gt; your browser or OS only produces a signature for the real domain. On a lookalike site the passkey simply doesn't work, so there's no code to be tricked into entering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing to steal in transit:&lt;/strong&gt; the private key never leaves your device's secure hardware, and the site stores only a public key. A server breach doesn't hand attackers a working credential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No shared secret:&lt;/strong&gt; there's no password or code to replay, guess, or reuse across sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local verification:&lt;/strong&gt; Face ID or Touch ID unlocks the key on your device, and your biometric isn't sent to the site.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SMS code&lt;/th&gt;
&lt;th&gt;Authenticator app&lt;/th&gt;
&lt;th&gt;Passkey&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can be SIM-swapped&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can be relayed by a phishing page&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (bound to the real domain)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret sent over the network&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (the code)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leaked by a server breach&lt;/td&gt;
&lt;td&gt;Password still at risk&lt;/td&gt;
&lt;td&gt;Password still at risk&lt;/td&gt;
&lt;td&gt;Public key only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This matches what researchers saw in August 2026: the large campaigns hitting organizations, such as Mirage2FA (4,532 domains) and Kali365 device-code phishing, defeated the kinds of factors that passkeys block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caveats&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recovery is the soft spot.&lt;/strong&gt; If account recovery falls back to SMS or email, an attacker can go around your passkey. Lock that down too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synced passkeys lean on your cloud account.&lt;/strong&gt; An Apple or Google account takeover matters more once your passkeys live there, so protect it with a strong recovery setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local compromise still counts.&lt;/strong&gt; Malware on your device is a different problem, as CVE-2026-34348 showed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any 2FA beats none.&lt;/strong&gt; SMS is weaker than an authenticator app or a passkey, but far better than a password alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Apple passkeys
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Built in:&lt;/strong&gt; they live in iCloud Keychain / Passwords, so there's no extra app to install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biometric unlock:&lt;/strong&gt; Face ID or Touch ID is the whole login flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synced and end-to-end encrypted&lt;/strong&gt; across your Apple devices, so losing a phone doesn't mean losing access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-device sign-in:&lt;/strong&gt; you can use a QR code to sign in on a non-Apple machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is ecosystem lock-in. If your life spans Windows, Android, and Linux, look at the alternatives below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;th&gt;Watch out for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android/Chrome users&lt;/td&gt;
&lt;td&gt;Tied to your Google account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1Password / Bitwarden / Dashlane / Proton Pass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-platform, teams, shared vaults&lt;/td&gt;
&lt;td&gt;Another vendor to trust; the quality of passkey support varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hardware keys (YubiKey etc.)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Highest assurance, device-bound&lt;/td&gt;
&lt;td&gt;Cost; you need backup keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows-first setups&lt;/td&gt;
&lt;td&gt;See the caveat below&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Passkeys aren't magic
&lt;/h2&gt;

&lt;p&gt;In August, SpecterOps presented "Pass-the-Passkey" research at Black Hat covering more than 20 techniques across Windows 11, Entra ID, browsers, and password managers. One finding was CVE-2026-34348, which Microsoft patched in July. The fair summary: the cryptography held, and passkeys moved the attacker from remote and cheap to local and expensive. That's a win, but "we deployed passkeys" isn't the end of the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Patch PHP, Node.js, and GitLab if you run them.&lt;/li&gt;
&lt;li&gt;Rotate any secrets that touched LiteLLM or other affected tooling.&lt;/li&gt;
&lt;li&gt;Turn on passkeys for your email, Apple/Google account, GitHub, and password manager first.&lt;/li&gt;
&lt;li&gt;Keep a recovery path: a second device or hardware key.&lt;/li&gt;
&lt;li&gt;If you build auth, add WebAuthn support to your app.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  October is also Hacktoberfest and Cybersecurity Awareness Month
&lt;/h2&gt;

&lt;p&gt;Black October landed in the middle of two other October traditions, and they pair well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cybersecurity Awareness Month&lt;/strong&gt; runs all of October, and it's long been about the basics: strong passwords or a password manager, multi-factor authentication, spotting phishing, and updating software. One 2026 write-up reports this year's theme from the National Cybersecurity Alliance as "Don't Make It Easy For Them," with extra attention on AI-driven risk. Themes differ by country (Canada's campaign is "Your best defence is you"), so check your local campaign. Passkeys fit the spirit: they remove the easiest thing for an attacker to steal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacktoberfest 2026&lt;/strong&gt; is different from the one you may remember. It's now run by Major League Hacking and DEV with DigitalOcean, and it's built around 300+ in-person events plus an online event focused on open-source AI. Pull requests no longer count toward rewards, partly because counting them led to maintainer burnout from low-effort contributions. That's worth keeping in mind below: the goal is useful fixes, not PR volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to help fix this stuff? Contribute to open-source security
&lt;/h2&gt;

&lt;p&gt;Much of what broke in Black October (PHP, Node.js, GitLab, LiteLLM) is open source, and maintainers are stretched. Here's how to help without adding noise:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with software you already use.&lt;/strong&gt; You know its quirks, and your fix helps you too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter issues.&lt;/strong&gt; On GitHub, look for labels like &lt;code&gt;good first issue&lt;/code&gt;, &lt;code&gt;help wanted&lt;/code&gt;, and &lt;code&gt;security&lt;/code&gt;, and comment to claim an issue before you start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; and &lt;code&gt;SECURITY.md&lt;/code&gt; first.&lt;/strong&gt; If you find an actual vulnerability, don't open a public issue. Follow the project's security policy and report it privately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn on 2FA for your GitHub account.&lt;/strong&gt; Many security-focused projects require it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality over quantity.&lt;/strong&gt; Understand every line you submit. OpenSSF's own newcomer guide warns that leaning on AI coding tools for a first contribution does more harm than good.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Places to start&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openssf.org/blog/2025/09/22/from-beginner-to-builder-your-first-code-contribution/" rel="noopener noreferrer"&gt;OpenSSF: From beginner to builder, your first code contribution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ossf" rel="noopener noreferrer"&gt;OpenSSF on GitHub&lt;/a&gt;: home of projects like Scorecard and Allstar&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bomctl/bomctl/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;bomctl&lt;/a&gt;: an OpenSSF Security Tooling project for working with SBOMs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vulnerablecode.readthedocs.io/en/stable/contributing.html" rel="noopener noreferrer"&gt;VulnerableCode&lt;/a&gt;: an open vulnerability database with good first issues&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://securitylab.github.com/" rel="noopener noreferrer"&gt;GitHub Security Lab&lt;/a&gt; and the &lt;a href="https://github.com/advisories" rel="noopener noreferrer"&gt;GitHub Advisory Database&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/projects/" rel="noopener noreferrer"&gt;OWASP projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hacktoberfest.com/" rel="noopener noreferrer"&gt;Hacktoberfest 2026&lt;/a&gt; and &lt;a href="https://dev.to/0shuvo0/hacktoberfest-2026-what-changed-1g3g"&gt;what changed this year&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Black_October_(information_security)" rel="noopener noreferrer"&gt;Black October (information security) – Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.securitytoday.de/en/2026/10/22/black-october-many-attacks-had-been-running-for-months/" rel="noopener noreferrer"&gt;Black October: Many attacks had been running for months – SecurityToday&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startwithidentity.com/news/archive/2026-10/" rel="noopener noreferrer"&gt;FIDO Passkey Index 2026 – Start with Identity news archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startwithidentity.com/blog/passkeys-first-hard-month/" rel="noopener noreferrer"&gt;Passkeys had a hard month, and none of it was the cryptography – Start with Identity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hacktoberfest.com/questions/" rel="noopener noreferrer"&gt;Hacktoberfest 2026 – official FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cybermagazine.com/news/cybersecurity-awareness-month-dont-make-it-easy-for-them" rel="noopener noreferrer"&gt;Cybersecurity Awareness Month: Don't Make It Easy For Them – Cyber Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openssf.org/blog/2025/09/22/from-beginner-to-builder-your-first-code-contribution/" rel="noopener noreferrer"&gt;OpenSSF: From beginner to builder, your first code contribution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>hacktoberfest</category>
      <category>passkey</category>
    </item>
    <item>
      <title>Automate Node.js Version Bumps with GitHub Actions (No Manual PRs Needed)</title>
      <dc:creator>Hansel Wei</dc:creator>
      <pubDate>Tue, 24 Feb 2026 01:10:00 +0000</pubDate>
      <link>https://dev.to/hansel/automate-nodejs-version-bumps-with-github-actions-no-manual-prs-needed-ol8</link>
      <guid>https://dev.to/hansel/automate-nodejs-version-bumps-with-github-actions-no-manual-prs-needed-ol8</guid>
      <description>&lt;p&gt;Manually bumping a package version is one of those low-value chores that's easy to forget, easy to mess up, and just annoying enough to interrupt your flow. You change &lt;code&gt;package.json&lt;/code&gt;, regenerate the lockfile, commit it, open a PR — every time, for every release.&lt;/p&gt;

&lt;p&gt;There's a better way: let a GitHub Actions workflow handle the entire thing on demand.&lt;/p&gt;

&lt;p&gt;Here's an example project with the workflow pattern I set up for one of my open source dev tool &lt;a href="https://github.com/darkmastermindz/line-commenter-tool" rel="noopener noreferrer"&gt;line-commenter-tool&lt;/a&gt;, which you can adapt for any Node.js project.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;When you're ready to cut a new version, you trigger a workflow dispatch from the GitHub Actions UI (or via the API/CLI). The workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks out your target branch&lt;/li&gt;
&lt;li&gt;Bumps the version in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runs &lt;code&gt;npm ci&lt;/code&gt; to regenerate &lt;code&gt;package-lock.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Opens a pull request with a clean commit and auto-generated description&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The resulting PR looks similar to this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;chore: bump version to 2.1.0&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated &lt;code&gt;package.json&lt;/code&gt; version to &lt;code&gt;2.1.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Regenerated &lt;code&gt;package-lock.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verified install with &lt;code&gt;npm ci&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Triggered via workflow dispatch by &lt;a class="mentioned-user" href="https://dev.to/hansel"&gt;@hansel&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No manual work. No forgotten lockfile updates. Just review and merge.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workflow
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/bump-version.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;New&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;semver&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(e.g.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2.2.0)'&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;target_branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Branch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;bump&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on"&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bump-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate version input&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validate&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;VERSION="${{ github.event.inputs.version }}"&lt;/span&gt;

          &lt;span class="s"&gt;# Validate semver format (major.minor.patch with optional pre-release/build metadata)&lt;/span&gt;
          &lt;span class="s"&gt;if ! echo "$VERSION" | grep -Eq '^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?$'; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "ERROR: '$VERSION' is not a valid semver version."&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

          &lt;span class="s"&gt;CURRENT_VERSION=$(node -p "require('./package.json').version")&lt;/span&gt;
          &lt;span class="s"&gt;echo "current=$CURRENT_VERSION" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;
          &lt;span class="s"&gt;echo "Current version: $CURRENT_VERSION"&lt;/span&gt;
          &lt;span class="s"&gt;echo "Requested version: $VERSION"&lt;/span&gt;

          &lt;span class="s"&gt;# Validate new version is strictly greater than current using Node&lt;/span&gt;
          &lt;span class="s"&gt;node -e "&lt;/span&gt;
            &lt;span class="s"&gt;const parseBase = (v) =&amp;gt; v.replace(/-.*/, '').split('.').map(Number);&lt;/span&gt;
            &lt;span class="s"&gt;const curr = parseBase('$CURRENT_VERSION');&lt;/span&gt;
            &lt;span class="s"&gt;const next = parseBase('$VERSION');&lt;/span&gt;
            &lt;span class="s"&gt;for (let i = 0; i &amp;lt; 3; i++) {&lt;/span&gt;
              &lt;span class="s"&gt;if (next[i] &amp;gt; curr[i]) { console.log('Validation passed: $VERSION &amp;gt; $CURRENT_VERSION'); process.exit(0); }&lt;/span&gt;
              &lt;span class="s"&gt;if (next[i] &amp;lt; curr[i]) {&lt;/span&gt;
                &lt;span class="s"&gt;console.error('ERROR: $VERSION is not greater than current version $CURRENT_VERSION');&lt;/span&gt;
                &lt;span class="s"&gt;process.exit(1);&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;console.error('ERROR: $VERSION must be strictly greater than current version $CURRENT_VERSION (equal versions are not allowed)');&lt;/span&gt;
            &lt;span class="s"&gt;process.exit(1);&lt;/span&gt;
          &lt;span class="s"&gt;"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure Git&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "github-actions[bot]"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "github-actions[bot]@users.noreply.github.com"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create release branch&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git checkout -b "chore/bump-version-${{ github.event.inputs.version }}"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bump version in package.json&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm version ${{ github.event.inputs.version }} --no-git-tag-version&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Regenerate package-lock.json&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install --package-lock-only&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify with npm ci&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commit changes&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git add package.json package-lock.json&lt;/span&gt;
          &lt;span class="s"&gt;git commit -m "chore: bump version to ${{ github.event.inputs.version }}"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Push branch&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git push origin "chore/bump-version-${{ github.event.inputs.version }}"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create Pull Request&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;BODY=$(cat &amp;lt;&amp;lt;'PREOF'&lt;/span&gt;
          &lt;span class="s"&gt;## Version Bump&lt;/span&gt;

          &lt;span class="s"&gt;Bumps the package version from `CURRENT_PLACEHOLDER` to `VERSION_PLACEHOLDER`.&lt;/span&gt;

          &lt;span class="s"&gt;### Changes&lt;/span&gt;
          &lt;span class="s"&gt;- Updated `package.json` version to `VERSION_PLACEHOLDER`&lt;/span&gt;
          &lt;span class="s"&gt;- Regenerated `package-lock.json`&lt;/span&gt;
          &lt;span class="s"&gt;- Verified install with `npm ci`&lt;/span&gt;

          &lt;span class="s"&gt;---&lt;/span&gt;
          &lt;span class="s"&gt;_Triggered via workflow dispatch by @ACTOR_PLACEHOLDER_&lt;/span&gt;
          &lt;span class="s"&gt;PREOF&lt;/span&gt;
          &lt;span class="s"&gt;)&lt;/span&gt;

          &lt;span class="s"&gt;BODY="${BODY//CURRENT_PLACEHOLDER/${{ steps.validate.outputs.current }}}"&lt;/span&gt;
          &lt;span class="s"&gt;BODY="${BODY//VERSION_PLACEHOLDER/${{ github.event.inputs.version }}}"&lt;/span&gt;
          &lt;span class="s"&gt;BODY="${BODY//ACTOR_PLACEHOLDER/${{ github.actor }}}"&lt;/span&gt;

          &lt;span class="s"&gt;gh pr create \&lt;/span&gt;
            &lt;span class="s"&gt;--title "chore: bump version to ${{ github.event.inputs.version }}" \&lt;/span&gt;
            &lt;span class="s"&gt;--body "$BODY" \&lt;/span&gt;
            &lt;span class="s"&gt;--base ${{ github.event.inputs.target_branch }} \&lt;/span&gt;
            &lt;span class="s"&gt;--head "chore/bump-version-${{ github.event.inputs.version }}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aside: Alternatively, you can try setting default input &lt;code&gt;target_branch&lt;/code&gt; to &lt;code&gt;${{ github.ref_name }}&lt;/code&gt; if you prefer to bump versions into feature branches rather than main and dynamically reference the current branch you are targeting.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;From the GitHub UI:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your repo → &lt;strong&gt;Actions&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Bump Version&lt;/strong&gt; from the left sidebar&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Run workflow&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter the new version number and target branch&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;Run workflow&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within seconds, a PR appears targeting your branch. Review the diff (should just be &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt;), then merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From the CLI with &lt;code&gt;gh&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh workflow run bump-version.yml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.1.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;target_branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-feature-branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Pattern Works Well
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It fits into your existing review process.&lt;/strong&gt; The version bump goes through a PR like any other change. You get to review it, run your CI checks, and merge intentionally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bot commit is honest.&lt;/strong&gt; The commit is attributed to &lt;code&gt;github-actions[bot]&lt;/code&gt;, so your git history clearly shows which bumps were automated versus manual. No noise in your contributor graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It handles the lockfile correctly.&lt;/strong&gt; Running &lt;code&gt;npm ci&lt;/code&gt; after the version bump ensures the lockfile is consistent. This catches any edge cases where a stale lockfile might cause issues downstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It targets feature branches, not just main.&lt;/strong&gt; Because &lt;code&gt;target_branch&lt;/code&gt; is an input, you can bump the version on a release branch or a feature branch mid-development — useful when you're preparing multiple releases in parallel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Variations Worth Considering
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Auto-detect the current version and increment it:&lt;/strong&gt; Instead of specifying the full version, accept a bump type (&lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;minor&lt;/code&gt;, &lt;code&gt;major&lt;/code&gt;) and use &lt;code&gt;npm version patch --no-git-tag-version&lt;/code&gt; to let npm calculate it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bump version&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm version ${{ github.event.inputs.bump_type }} --no-git-tag-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auto-merge on approval:&lt;/strong&gt; Add a &lt;code&gt;pull_request_review&lt;/code&gt; trigger or use a merge queue to automatically merge version bump PRs after CI passes, removing the need to manually merge them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tag the release after merge:&lt;/strong&gt; Chain a second workflow that listens for merged PRs with the &lt;code&gt;chore/bump-version-*&lt;/code&gt; naming pattern and creates a git tag automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This is a small workflow but it removes a surprisingly persistent source of friction. Once it's in place, you stop thinking about version bumps entirely — you just trigger the workflow, review the PR, and merge. &lt;/p&gt;

&lt;p&gt;The full example is live in the &lt;a href="https://github.com/darkmastermindz/line-commenter-tool/pull/93" rel="noopener noreferrer"&gt;line-commenter-tool repo&lt;/a&gt; if you want to see what the generated PR looks like in practice.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have a variation of this pattern that works well for your project? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>github</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>Breadth vs Depth - How do you organize your brain as a software engineer and communicate with different styles?</title>
      <dc:creator>Hansel Wei</dc:creator>
      <pubDate>Fri, 30 Jun 2023 12:56:05 +0000</pubDate>
      <link>https://dev.to/hansel/breadth-vs-depth-how-do-you-organize-your-brain-as-a-software-engineer-and-communicate-with-different-styles-44ah</link>
      <guid>https://dev.to/hansel/breadth-vs-depth-how-do-you-organize-your-brain-as-a-software-engineer-and-communicate-with-different-styles-44ah</guid>
      <description>&lt;p&gt;Paired teamwork makes the dream work! Recently, one of my colleagues worked on filling out a requirements document to lead a new project with me and the synergy of how we thought in opposite ways helped complete our goal in minutes. We both emailed each other about it and was struggling define everything asynchronously so we both hopped on a call and sorted things out.&lt;/p&gt;

&lt;p&gt;What was our secret sauce to success from ideation to defining constraints? It was our different approaches and processes in design thinking! We quickly identified that we had different styles and had a conversation about breadth vs depth. We organized our conversation by taking turns to understand our differences, allowing us to complement each other's perspectives, styles of communication, and design thinking processes. This helped us effectively leverage our unique strengths and collaborate seamlessly.&lt;/p&gt;

&lt;p&gt;This experience strongly resonated with Tim Cook's quote on how diversity leads to better products, as it highlighted the power of embracing different perspectives:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you believe, as we believe, that diversity leads to better products, and we're all about making products that enrich people's lives, then you obviously put a ton of energy behind diversity the same way you would put a ton of energy behind anything else that is truly important." - Tim Cook&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whenever you make a decision for simplicity sake, we can model this as the brain choosing between &lt;strong&gt;Decision A&lt;/strong&gt; and &lt;strong&gt;Decision B&lt;/strong&gt; so in computer science we'd most likely model this representation as a Decision Tree. If you studied Data Structures and Algorithms, you'd know about two different patterns, depth first search (DFS) vs breadth first search (BFS)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8ujng132kpqo7actsbk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8ujng132kpqo7actsbk.jpg" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Depth-first search&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We traverse through left subtree(s) first then traverse through the right subtrees&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Breadth-first search&lt;/strong&gt; involves search through a tree one level at a time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We traverse through one entire level of children nodes first (Decision A and Decision B), before moving on to traverse through the grandchildren nodes. And we traverse through an entire level of grandchildren nodes before going on to traverse through great-grandchildren nodes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I must mention that this is a greatly simplified explanation. Our brains are more complex than continuously comparing two parameters in a linear fashion. Exploring the intricacies of decision-making, which involves multiple parameters, falls beyond the scope of this post. If you're interested in learning how data scientists model many parameters to make decisions, I encourage you to search for information on &lt;a href="https://www.geeksforgeeks.org/difference-between-ann-and-bnn/"&gt;Artificial Neural Networks (ANN) vs Biological Neural Networks (BNN)&lt;/a&gt; in your next google search to understand the differences between computer-modeled and biological decision-making!&lt;/p&gt;

&lt;p&gt;In its simplest form, when explaining AI to someone, you can consider &lt;a href="https://towardsdatascience.com/pushing-towards-the-explainable-ai-era-neural-networks-are-decision-trees-1603ab97eb1b"&gt;artificial neural network are decision trees&lt;/a&gt; with more parameters. They incorporate statistics, probability math, designs on how nodes flow and communicate information, and algorithms applied.&lt;/p&gt;

&lt;p&gt;With that, I leave you with these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do you organize your thoughts? - What about when problem solving with someone on your team vs your approach to learning new skills alone? (Breadth vs Depth)&lt;/li&gt;
&lt;li&gt;What struggles do you have with your team when communicating - how did you resolve this?&lt;/li&gt;
&lt;li&gt;How do you design your communication flows?&lt;/li&gt;
&lt;li&gt;What can be improved - who and what conversations can help you grow as a engineer, developer, or leader?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stay curious!&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
