<?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: Aaron Steers</title>
    <description>The latest articles on DEV Community by Aaron Steers (@aaronsteers).</description>
    <link>https://dev.to/aaronsteers</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F343034%2Fedb2f3a6-dbc2-4de1-b10c-32eff5b6ede1.png</url>
      <title>DEV Community: Aaron Steers</title>
      <link>https://dev.to/aaronsteers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaronsteers"/>
    <language>en</language>
    <item>
      <title>Introducing ReelTrust: What if data engineering could solve our AI deepfakes problem?</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Mon, 27 Oct 2025 19:13:05 +0000</pubDate>
      <link>https://dev.to/aaronsteers/introducing-reeltrust-what-if-data-engineering-could-solve-our-ai-deepfake-problem-5ba3</link>
      <guid>https://dev.to/aaronsteers/introducing-reeltrust-what-if-data-engineering-could-solve-our-ai-deepfake-problem-5ba3</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR: This weekend I built &lt;a href="https://github.com/aaronsteers/ReelTrust" rel="noopener noreferrer"&gt;ReelTrust&lt;/a&gt; a new type of video authentication software, which I hope others will &lt;strong&gt;either&lt;/strong&gt; continue to expand upon it &lt;strong&gt;or&lt;/strong&gt; build something better - ASAP.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ReelTrust is designed to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prove a video's source and authenticity.&lt;/li&gt;
&lt;li&gt;Protect that video against accusations of manipulation.&lt;/li&gt;
&lt;li&gt;Ensure that future doctoring is clearly detectable.&lt;/li&gt;
&lt;li&gt;Do all the above built on open source solution with transparency built in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Under the hood, I treated this as a data engineering metadata pipeline problem: build the simplest-possible solution that handles huge audiovisual datasets efficiently, respecting privacy and security, with a focus on leveraging at scale for multiple audiences and use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built ReelTrust
&lt;/h2&gt;

&lt;p&gt;For at least two years now, we've all known the AI technologies would be soon creating videos that look identical to real-life videos. And with Sora 2 now launched, we've woken up to find that that future is now. The news media (CNN, NYT, Reuters, etc) and media distribution industries (YouTube, TikTok, etc.) have collectively failed to prepare for our current reality. Not only a topic of news itself, I now regularly overhear people in coffee shops bemoaning that they "just can't tell what is real any more". &lt;/p&gt;

&lt;p&gt;With things getting worse, and no plan in place, I finally felt I needed to invest some of my weekend hours and take some action myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How ReelTrust works
&lt;/h2&gt;

&lt;p&gt;For those who just want to see some code, here's what the CLI looks like today. (Note, these code examples would be "real" once as the package is uploaded to PyPI.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install uv if it's not installed already&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;uv

&lt;span class="c"&gt;# Create a verification package&lt;/span&gt;
uvx reeltrust create-package my-orig-video.mp4

&lt;span class="c"&gt;# Verify the original video (passes)&lt;/span&gt;
uvx reeltrust verify my-orig-video.mp4 .data/outputs/packages/my-orig-video

&lt;span class="c"&gt;# Verify a compressed/re-encoded video (passes)&lt;/span&gt;
uvx reeltrust verify my-video-compressed.mp4 .data/outputs/packages/my-orig-video

&lt;span class="c"&gt;# Verify a clip taken from the original video (passes)&lt;/span&gt;
uvx reeltrust verify clip-from-my-video.mp4 .data/outputs/packages/my-orig-video

&lt;span class="c"&gt;# Verify a doctored version of the original video (fails)&lt;/span&gt;
uvx reeltrust verify my-video-tampered.mp4 .data/outputs/packages/my-orig-video

&lt;span class="c"&gt;# Verify a doctored clip taken from the original video (fails)&lt;/span&gt;
uvx reeltrust verify clip-from-my-video-tampered.mp4 .data/outputs/packages/my-orig-video
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ReelTrust Rollout
&lt;/h2&gt;

&lt;p&gt;Once an MVP (minimum viable product) is fully complete, ReelTrust would work in partnership across several parties:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Video Content Creators (CNN, New York Times, White House Correspondents, etc.)
&lt;/h3&gt;

&lt;p&gt;While capturing video, content creators pre-process their video and create a ReelTrust verification package. The verification package is a robust set of fingerprint metadata on the audio and video files.&lt;/p&gt;

&lt;p&gt;Creators invest in some additional processing and storage costs, in exchange for an improved trust relationship with their customers and their end users (i.e. content consumers).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Package Hosting and Indexing Providers (AWS S3)
&lt;/h3&gt;

&lt;p&gt;In its simplest form, the verification package hosting service hosts packages in publicly accessible manner, such as a public S3 bucket or a public static site with the ability for users to list and download verification resources.&lt;/p&gt;

&lt;p&gt;More advanced forms could provide a "find-by-clip" feature via advanced indexing, as well as services to privately store higher-res original video without surfacing that original content on the public internet.&lt;/p&gt;

&lt;p&gt;All verification assets would be digitally signed at time of creation and/or at time of upload, providing proof of the video verification package's creation time, geolocation, and contents.&lt;/p&gt;

&lt;p&gt;Importantly, while fingerprint information may be freely hosted on public servers, the high fidelity content itself is not publicly shared. This allows the public to freely verify authenticity and also to detect manipulation, while not enabling others to steal their content.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Video Distributors (YouTube, Facebook, TikTok)
&lt;/h3&gt;

&lt;p&gt;Video distributors like YouTube would read their content creators' metadata during the video upload process, compare with attached ReelTrust package URIs, and accept or reject the video publish based on verification results. Apart from rejecting outright, videos could also be allowed to be published regardless of verification status, while displaying to users the results of verification inline to the videos being consumed.&lt;/p&gt;

&lt;p&gt;When no ReelTrust verification information is available, the experience for users may be exactly the same as their experience today - except for a blanket caveat that &lt;em&gt;zero&lt;/em&gt; verification has been performed on the content's authenticity. For positively confirmed verifications, the user would see something akin to a green checkmark or lock symbol (✅🔒) - with an option to view additional metadata on who created the original video, where and when it was authored, along with how exactly the videos contents were confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a future look like with ReelTrust?
&lt;/h2&gt;

&lt;p&gt;The future with a system like ReelTrust would entail every important national event having signed, verified ReelTrust media certificates. Elections, interviews, news footage - it would all be certified and signed. Authentic footage of these events would be marked clearly as "✅🔒 ReelTrust Certified Video". Dubious or unsigned footage would be marked as such, and even edited footage that was still authentic would be clearly marked as edited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All of this would be built on lessons learned on how to build the same distributed trust foundation that we rely on daily today for safe online shopping, and to keep malware out of our emails.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the future look like if we do nothing?
&lt;/h2&gt;

&lt;p&gt;If we do nothing, things continue to get much worse. Fake video will be presented as real, while authentic videos will be slandered as AI fakes. If we do nothing, we lose our ability as a society to believe our eyes. It's already happening, so we need to act fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is included in the Proof of Concept (POC)
&lt;/h2&gt;

&lt;p&gt;I'm hosting on GitHub at &lt;a href="https://github.com/aaronsteers/ReelTrust" rel="noopener noreferrer"&gt;https://github.com/aaronsteers/ReelTrust&lt;/a&gt; under the MIT license.&lt;/p&gt;

&lt;p&gt;What it can do today is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create verification packages that combine a low_res video digest along with a variety of video and audio fingerprints.&lt;/li&gt;
&lt;li&gt;Compare a given video against the verification package, printing a verification report and "PASS" or "FAIL" status of verification.&lt;/li&gt;
&lt;li&gt;Works on re-encoded or compressed videos as well as the original fidelity.&lt;/li&gt;
&lt;li&gt;Create 5-second side-by-side comparison clips where deviations are detected - comparing the evaluated video against the recorded low-res digest.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tackling video authenticity as a data engineering problem
&lt;/h2&gt;

&lt;p&gt;If you've worked with me, you know that video analysis is not my personal area of expertise - far from it! But data engineering &lt;strong&gt;is&lt;/strong&gt; my expertise - and my approach was basically to approach video authenticity as a data engineering problem.&lt;/p&gt;

&lt;p&gt;What's being built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composable pipelines to capture video/audio fingerprints.&lt;/li&gt;
&lt;li&gt;Frame-level metadata slices (SSIM, perceptual hashes, stats).&lt;/li&gt;
&lt;li&gt;CLI tools for verification, clip matching, and offset detection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No AI/ML required (yet). Just reliable data structures, smart comparisons, and a heavy reliance on hashing, fingerprints, and clever vector embeddings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to get involved?
&lt;/h2&gt;

&lt;p&gt;My primary motivation in creating this project was to show (to myself, my friends, and the industry) that this is indeed possible, and that it is worth more investment.&lt;/p&gt;

&lt;p&gt;Everything in the project is shared freely as open source. Feel free to fork the repo and improve it. Feel free to drop me a line if you want to talk. This was entirely created during my personal time, and I do want to see this become a reality.&lt;/p&gt;

&lt;p&gt;Chime in below - do you think this is project overly ambitious - or too boring / obvious? Any fatal flaws in the approach? Is someone you know of already already building something similar to this?&lt;/p&gt;

&lt;p&gt;Like or share so this can reach more eyeballs - and hopefully the industry partners that need to act eventually will.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;br&gt;
-Aaron (AJ) Steers&lt;/p&gt;

&lt;p&gt;Repo link here: &lt;a href="https://github.com/aaronsteers/ReelTrust" rel="noopener noreferrer"&gt;https://github.com/aaronsteers/ReelTrust&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Modern Ways to (not) Install Python and Virtual Environments</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Wed, 01 Oct 2025 20:29:21 +0000</pubDate>
      <link>https://dev.to/aaronsteers/the-modern-ways-to-not-install-python-1e85</link>
      <guid>https://dev.to/aaronsteers/the-modern-ways-to-not-install-python-1e85</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR: You can use &lt;code&gt;uv&lt;/code&gt; for everything now. Just &lt;code&gt;brew install uv&lt;/code&gt; and then you can forget about &lt;code&gt;brew&lt;/code&gt;, &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;pipx&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt;, and all the others.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we are today
&lt;/h2&gt;

&lt;p&gt;The Python ecosystem has changed a lot over the past few years. What used to be best practices are quickly becoming anti-patterns. The biggest challenge I see with folks using Python today is that they are stuck in old patterns that cost them both time and pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Outlawed Patterns List
&lt;/h2&gt;

&lt;p&gt;If you are using any of these patterns, please stop immediately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything related to &lt;code&gt;pyenv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Calling &lt;code&gt;pip&lt;/code&gt; directly, for any reason.&lt;/li&gt;
&lt;li&gt;Calling &lt;code&gt;python&lt;/code&gt; directly, and/or expecting &lt;code&gt;python&lt;/code&gt; on &lt;code&gt;PATH&lt;/code&gt; to be a specific version.&lt;/li&gt;
&lt;li&gt;Anything related to &lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;virtualenv&lt;/code&gt;, or &lt;code&gt;activate&lt;/code&gt;, or manually creating or activating virtual environments in any way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Modern Way to Install Python
&lt;/h2&gt;

&lt;p&gt;Note: You probably don't actually &lt;em&gt;need&lt;/em&gt; to install Python before you start. In less than 2 seconds, the &lt;code&gt;uv&lt;/code&gt; tool (as you'll see below) can install Python versions on-demand for apps, projects, and scripts. So you can &lt;em&gt;probably&lt;/em&gt; skip this step entirely. But if not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install uv or update it if it's already installed:
brew install uv

# Show the versions of Python available and/or installed:
uv python list

# Install a couple Python versions
uv python install 3.13
uv python install 3.12

# Set your global python version (`python` on `PATH`)
uv python install 3.13 --global --preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Modern Way to Manage Virtual Environments
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;You should never need to manually create a virtual environment again.&lt;/strong&gt; The manner in which you create your virtual environment will depend on whether you are running an app, writing code for a project, or writing a script. But for all of the below patterns, the virtual environment is created automatically, with no way to mess up, and no way to forget to activate or deactivate an environment.&lt;/p&gt;

&lt;p&gt;Identify your use case from one of these three patterns, and apply the suggested pattern:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Installing a Python App
&lt;/h3&gt;

&lt;p&gt;Simply &lt;code&gt;uv tool install my-tool&lt;/code&gt; and then you'll have &lt;code&gt;my-tool&lt;/code&gt; on your PATH.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Running a Python App
&lt;/h3&gt;

&lt;p&gt;Skip the install step and use &lt;code&gt;uvx&lt;/code&gt;: &lt;code&gt;uvx my-tool --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This works from anywhere you have &lt;code&gt;uv&lt;/code&gt; installed.&lt;/p&gt;

&lt;p&gt;You can optionally set the python version to something explicit and &lt;code&gt;uv&lt;/code&gt; will lightning-fast bootstrap that version of Python if it isn't already installed:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uvx --python=3.12 my-tool --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can also pin to a specific version of your tool or force the "latest" on each run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uvx my-tool@latest --version
uvx my-tool@3.2.1 --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Write Python Code for a Project
&lt;/h3&gt;

&lt;p&gt;Simply use &lt;code&gt;uv init&lt;/code&gt; to create a new project directory, &lt;code&gt;uv add&lt;/code&gt; to add dependencies, and &lt;code&gt;uv run&lt;/code&gt; to run them. Unlike it's predecessor, Poetry, you don't even have to explicitly install anything, since &lt;code&gt;uv run&lt;/code&gt; implies &lt;code&gt;uv sync&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a `repos` directory if you don't have one yet:
mkdir ~/repos
cd ~/repos

# Create the `uv` project scaffold:
uv init my-new-project
cd my-new-project

# Optionally set the Python version you want for this project:
uv python pin 3.13

# You can immediately run the sample without any extra steps
uv run main.py

# You can add dependencies (replaces `pip install`):
uv add my-other-dependency-a my-other-depedency-b

# Dependencies are auto-installed whenever you call `uv run`:
uv run main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Write a Portable Python Script
&lt;/h4&gt;

&lt;p&gt;Sometimes you don't want a full project, or you need to have many scripts each with their own dependencies. This is easy to do with &lt;code&gt;uv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Take this example &lt;code&gt;my_helper_script.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env -S uv run --script
#
# Inline dependency declaration (PEP 723):
# /// script
# requires-python = "&amp;gt;=3.10"
# dependencies = [
#   "my-dependency-a",
#   "my-dependency-b",
# ]
# ///
#
# Usage with uv CLI:
#    uv run --script ./my_helper_script.py
#
# With the custom shebang, you can also invoke directly:
#    ./my_helper_script.py
#
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;my_dep_a&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;my_dep_b&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi, there!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a script that can run anywhere, on any version of Python (no Python install necessary), with your dependencies automatically bootstrapped and fully isolated from other Python environments and potential version conflicts. 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  What did I miss?
&lt;/h2&gt;

&lt;p&gt;I'll update the article with any tips or tricks that others share in comments. Comment down below if I missed anything.&lt;/p&gt;

</description>
      <category>python</category>
      <category>uv</category>
    </item>
    <item>
      <title>Escaping Your Java Habits in Python: Writing Clean, Pythonic Code</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Fri, 29 Aug 2025 03:22:20 +0000</pubDate>
      <link>https://dev.to/aaronsteers/escaping-your-java-habits-in-python-writing-clean-pythonic-code-2en</link>
      <guid>https://dev.to/aaronsteers/escaping-your-java-habits-in-python-writing-clean-pythonic-code-2en</guid>
      <description>&lt;p&gt;As engineers, many of us migrate between languages. &lt;br&gt;
Fun fact: 20 years ago - what was the first language I was ever certified in? &lt;strong&gt;Java.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;But now, a dozen languages later, I want to pull my hair out when I feel like I'm reading Java code inside a file that ends in a "&lt;code&gt;.py&lt;/code&gt;" extension.&lt;/p&gt;

&lt;p&gt;If you’ve spent significant time in Java, it’s natural to bring those habits along when coding in Python. Unfortunately, some of those habits can lead to over-engineered or awkward code that doesn’t at all feel &lt;a href="https://peps.python.org/pep-0020/" rel="noopener noreferrer"&gt;&lt;strong&gt;Pythonic&lt;/strong&gt;&lt;/a&gt;. Worse: your habits may be contributing to bugs, and (worse yet:) slowing down code review.&lt;/p&gt;

&lt;p&gt;Not to bring shame, but to improve everyone's lives: I think these patterns are worth calling out — especially for developers making the jump from Java to Python.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Overcompensating for Dependency Injection (DI)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The Java mindset
&lt;/h3&gt;

&lt;p&gt;Java is not particularly strong at dependency injection (DI). Without additional frameworks (e.g. Spring, Dagger, Guice, etc.), it's actually super difficult. Unbenounced to many, DI in Python is super trivial, actually. To manage dependencies, Java developers writing Python often build &lt;em&gt;layers&lt;/em&gt; of abstractions, factories, and injection systems where none are truly needed.&lt;/p&gt;
&lt;h3&gt;
  
  
  How it leaks into Python
&lt;/h3&gt;

&lt;p&gt;When we carry this mindset into Python, we often over-engineer DI using generics, abstract base classes, and unnecessary indirection. While Python &lt;em&gt;can&lt;/em&gt; do this, it usually isn't needed - and our future selves will thank us if we keep things simple.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Pythonic alternative
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prefer passing simple functions, Callables, and Unions of types.&lt;/li&gt;
&lt;li&gt;Embrace Python’s duck typing: if an object behaves the way you need, you don’t need to enforce a generic type hierarchy.&lt;/li&gt;
&lt;li&gt;Use default arguments or keyword arguments for flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Java-style mindset in Python
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DataFetcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpDataFetcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataFetcher&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;fetcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DataFetcher&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpDataFetcher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Pythonic mindset
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version is shorter, clearer, and easier to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The “Everything Must Be a Class” Habit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Java mindset
&lt;/h3&gt;

&lt;p&gt;In Java, basically everything lives inside a class. Utility methods go into static classes. Even trivial helpers often get wrapped into objects because free functions aren’t idiomatic.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it leaks into Python
&lt;/h3&gt;

&lt;p&gt;When carried into Python, we end up with tiny, boilerplate-heavy classes that don’t add real value. For example, you might see a &lt;code&gt;StringUtils&lt;/code&gt; or &lt;code&gt;ConnectionBuilder&lt;/code&gt; class in Python, which is entirely unnecessary and adds unnecessary friction to your callers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pythonic alternative
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write standalone helper functions if a class is not truly needed.&lt;/li&gt;
&lt;li&gt;Use modules as namespaces (a Python file &lt;em&gt;is already&lt;/em&gt; a container).&lt;/li&gt;
&lt;li&gt;Only create classes when state or behavior needs to be encapsulated, or when instantiating the object adds something meaningful to your workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Java-style mindset in Python
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MathUtils&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nd"&gt;@staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MathUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;

&lt;span class="c1"&gt;# Pythonic mindset
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, the second version is shorter, more natural, and easier to maintain.&lt;/p&gt;

&lt;p&gt;Best yet: the person reading or reviewing the code &lt;em&gt;knows&lt;/em&gt; (via static code analysis) that calling the function is correct - no pre-knowledge of how to work with the class is needed in order to review the code. This is an area where Java classically fails in regards to code review and also for AI agent applications: the amount of context needed to review code or to create new code is much higher if you need to fully understand a class's structure. &lt;/p&gt;

&lt;p&gt;Compare this with helper functions: there's no "wrong way" to call a helper function; you only need to read the docstring and function signature (aka, use tooltips and Intellisense) to confirm if the function call is correct or not.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Overusing Interfaces and Abstract Base Classes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Java mindset
&lt;/h3&gt;

&lt;p&gt;Every service has an interface, every implementation must be bound to it. This enforces structure, but at the cost of boilerplate.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it leaks into Python
&lt;/h3&gt;

&lt;p&gt;Developers sometimes mimic this pattern with abstract base classes and heavy use of &lt;code&gt;Generic&lt;/code&gt; types, even for simple use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pythonic alternative
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use duck typing: if an object supports the methods you need, that’s enough.&lt;/li&gt;
&lt;li&gt;When structure matters, consider &lt;code&gt;typing.Protocol&lt;/code&gt; for lightweight contracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Java-style mindset in Python
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PrintService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Pythonic mindset
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PrintService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PrintService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second method uses less code, and is easier to support.&lt;/p&gt;

&lt;p&gt;🤫 &lt;em&gt;Psst!&lt;/em&gt; Don't worry: the type checker will always tell you if you call a method that doesn't exist on the class! Adding type checks to your CI means this is &lt;em&gt;always&lt;/em&gt; safe, with often 50% less code and a much more readable and maintainable implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Verbose Builders Instead of Simple Keyword Arguments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Java mindset
&lt;/h3&gt;

&lt;p&gt;Builders are everywhere for object construction with optional arguments.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it leaks into Python
&lt;/h3&gt;

&lt;p&gt;Developers sometimes reimplement builder-style classes just to avoid long &lt;code&gt;__init__&lt;/code&gt; signatures.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pythonic alternative
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use keyword arguments with defaults.&lt;/li&gt;
&lt;li&gt;For structured objects, use &lt;code&gt;dataclasses&lt;/code&gt; or &lt;code&gt;Pydantic&lt;/code&gt; models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Java-style builder in Python
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserBuilder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserBuilder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;set_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;set_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Pythonic with dataclasses
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, the Pythonic version requires 75% less code, while being more readable, more maintainable, and much less likely to have unexpected bugs creeping in over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Not Using Keyword Arguments When You Should
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Java mindset
&lt;/h3&gt;

&lt;p&gt;Function calls are almost always positional (Java doesn't support keyword args), and IDEs enforce correctness through signatures and tooling, while your function and method args inevitable devolve into long list of fragile and hard-to-verify positional inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it leaks into Python
&lt;/h3&gt;

&lt;p&gt;Ex-Java developers often continue to use positional arguments in Python - even for long, many-input functions. This makes code fragile and unreadable—especially during reviews, where it’s literally impossible to confirm correctness without knowing the implementation signature by heart.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pythonic alternative
&lt;/h3&gt;

&lt;p&gt;Use keyword arguments for clarity and maintainability. They make function calls self-documenting and trivial to verify.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Fragile and hard to review
create_source(name, config, catalog, state)

# Clear and verifiable
create_source(
    source_name=name,
    config=config,
    catalog=catalog,
    state=state,
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The latter is &lt;em&gt;obviously&lt;/em&gt; correct and clear to its reader, whereas the former is literally impossible to verify from the code alone. The Pythonic version takes &amp;lt;2 seconds to reach 100% confidence (if it passes lint checks: it's correct), whereas in the Java-esque version, there's almost &lt;em&gt;zero&lt;/em&gt; ability to reach a high confidence at all. You are fully leaning on tests and type checks - and if &lt;em&gt;any&lt;/em&gt; of the arg types are the same, then you are 100% leaning on tests.&lt;/p&gt;

&lt;p&gt;🧠 Ironically: even though the Pythonic version has more characters, your eye passes over it &lt;em&gt;faster&lt;/em&gt;, quickly and subconsciously confirming the implementation in 0-2 seconds, whereas your brain freezes or just gives up when trying to review the first version. Since you don't have access to docs with the order of the input args, your ability to code review that (admittedly shorter) code snippet is zero-to-nil - unless you &lt;em&gt;really&lt;/em&gt; &lt;strong&gt;really&lt;/strong&gt; suspect something is wrong with it.&lt;/p&gt;

&lt;p&gt;What's worse: our code changes and evolves over time. Named args ensure your code will break cleanly when it is broken. Relying on positional args is like setting a time bomb that you know will &lt;em&gt;eventually&lt;/em&gt; go off, but you just don't know when. 💣&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;If you’re coming from Java:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don’t over-engineer dependency injection—Python’s simplicity usually covers most use cases.&lt;/li&gt;
&lt;li&gt;Don’t create classes for everything—standalone functions are fine (and often preferred).&lt;/li&gt;
&lt;li&gt;Skip unnecessary interfaces—use duck typing or protocols only if truly needed.&lt;/li&gt;
&lt;li&gt;Use dataclasses and simple constructors instead of builders.&lt;/li&gt;
&lt;li&gt;Prefer keyword arguments in function calls for clarity and reviewability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The beauty of Python is its flexibility and minimalism. Lean into that. By shedding some habits from Java, your code will not only &lt;em&gt;feel&lt;/em&gt; more Pythonic but will also be easier to read, maintain, and extend.&lt;/p&gt;

&lt;p&gt;It's not about which language is better - it's about making your code readable, maintainable, and intuitive to leverage and support. In the age of AI, these can mean the difference between keeping up, or falling behind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for the future of AI
&lt;/h2&gt;

&lt;p&gt;In the future, AI will write much more of the code that we all write and maintain today - but it has the same limitations that we have: it is reliant on limited context windows and on context-clues to correctly read and interpret code. If you want to future proof your code in 2025 and 2026: write code that even a mindless robot can review and maintain for you.&lt;/p&gt;

&lt;p&gt;In other words, keep it &lt;a href="https://peps.python.org/pep-0020" rel="noopener noreferrer"&gt;Pythonic&lt;/a&gt; - regardless of whether you are writing Python, Java, or Kotlin. 😅&lt;/p&gt;

</description>
      <category>python</category>
      <category>java</category>
      <category>cleancode</category>
      <category>programming</category>
    </item>
    <item>
      <title>"Dismiss Review": The Underrated GitHub Feature You're *Probably* Not Using</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Sun, 13 Apr 2025 00:31:27 +0000</pubDate>
      <link>https://dev.to/aaronsteers/the-most-underrated-github-feature-youre-probably-not-using-dismiss-review-1h0e</link>
      <guid>https://dev.to/aaronsteers/the-most-underrated-github-feature-youre-probably-not-using-dismiss-review-1h0e</guid>
      <description>&lt;p&gt;If you’ve ever hesitated to hit “Request Changes” on a GitHub pull request (PR), you’re not alone.&lt;/p&gt;

&lt;p&gt;In so may teams I've worked with, it feels like there's a quiet tension around that big red "❌". It feels heavy, negative, maybe even a hit to the author's morale. Like you’ve just pulled the emergency brake on someone else's momentum.&lt;/p&gt;

&lt;p&gt;But what if I told you that GitHub has a built-in feature that &lt;em&gt;solves&lt;/em&gt; this problem — and almost no one uses it?&lt;/p&gt;

&lt;p&gt;Let me introduce you to: &lt;strong&gt;Dismiss Review&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Request Changes" Feels Like a Last Resort
&lt;/h2&gt;

&lt;p&gt;Here’s what often happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You're reviewing a PR and notice a few things worth changing. They're important and they do need to be addressed, but they are small, easy fixes. And as a reviewer, you may also be aware that you could be wrong about your requested change - it may already be addressed elsewhere or you could be misunderstanding the scenario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You &lt;em&gt;could&lt;/em&gt; leave a comment with “Please fix this,” but without the formal red “Request Changes” option. If you post as a comment though, you are communicating that this is non-blocking, which means you'd be okay with no change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the other hand, hitting “Request Changes” puts a red "❌" on the PR—and that feels like you're putting up a roadblock. There's a very significant risk that you will be busy later and unable to come back to re-review in a timely fashion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a reviewer, you worry: Will this discourage the author? Will it delay merging until you can come back and review it &lt;em&gt;again&lt;/em&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what do most people do?  &lt;/p&gt;

&lt;p&gt;They avoid using “Request Changes” at all - unless absolutely necessary — leaving feedback as a "Comment" even when it requests what we believe are &lt;em&gt;important&lt;/em&gt; requested changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Here’s the Thing…
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You can dismiss a review.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Let me say that again: &lt;strong&gt;PR authors with "write" access can dismiss a review once the feedback has been addressed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is built-in GitHub functionality: simply click the &lt;code&gt;...&lt;/code&gt; menu next to a review and hit “Dismiss Review”: &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%2Fnly7289vo4oc139lu7vp.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%2Fnly7289vo4oc139lu7vp.png" alt="Screenshot: dismissing review" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After dismissing, the original feedback stays visible for transparency, but it’s no longer blocking the merge.&lt;/p&gt;

&lt;p&gt;It’s like saying:  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Hey, this was useful feedback and it needed to be addressed, but now that it's resolved, we’re good to go—even if the reviewer doesn't come back to confirm.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In fact, there's even a place for you as the PR author to explain why you are dismissing. And ALL of these are &lt;strong&gt;perfect&lt;/strong&gt; reasons to dismiss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Changes applied, per feedback. Dismissing."&lt;/li&gt;
&lt;li&gt;"Changes applied and original reviewer is on PTO. Dismissing."&lt;/li&gt;
&lt;li&gt;"Per my reply, the concern raised is addressed elsewhere in the code. Dismissing."&lt;/li&gt;
&lt;/ul&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%2Fh296cj2u7j82yolzpz4y.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%2Fh296cj2u7j82yolzpz4y.png" alt="Screenshot: providing reason to dismiss" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So Why Aren’t More People Doing This?
&lt;/h2&gt;

&lt;p&gt;The short and sad answer seems to be: hardly anyone knows this feature exists.&lt;br&gt;&lt;br&gt;
And without knowing that, reviewers are hesitant to be honest. Authors are hesitant to move forward.&lt;/p&gt;

&lt;p&gt;That’s bad for everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's Normalize a Better Workflow
&lt;/h3&gt;

&lt;p&gt;Here’s what I suggest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As reviewers, feel empowered to “Request Changes”&lt;/strong&gt; when something actually needs to change—even small things.&lt;br&gt;&lt;br&gt;
It's clearer and more actionable for the author.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As authors, feel empowered to address the feedback and dismiss the review&lt;/strong&gt; (with a reason) once you’ve done the work.&lt;br&gt;&lt;br&gt;
Especially if the reviewer is senior and busy—it’s not disrespectful, it’s responsible. You can &lt;strong&gt;also&lt;/strong&gt; re-request their review, but that subsequent re-review won't block your merge if others have approved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As reviewers, communicate your intent.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I often say: &lt;em&gt;“Feel free to dismiss this review once these are addressed.”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
This lets the author know I don’t need to come back and re-review—it’s not about red tape, it’s about getting things right.&lt;br&gt;
Conversely, if I say "let's talk about this" or "I'm a bit worried about this", I would hope it's a clear signal that allowing time for a re-review is probably expected on my part, rather than dismissing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;As teams, normalize trust and ownership.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The GitHub workflow is a tool. At the end of the day, it comes down to people acting responsibly, clearly, and with mutual trust.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“Request Changes” is valuable—but relatively unknown.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Dismiss Review” is the missing puzzle piece that unlocks a healthier review culture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can give and receive better feedback &lt;em&gt;without&lt;/em&gt; slowing down merges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let’s use the tools GitHub gives us—and trust each other to use them well.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WDYT?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Are you already using the &lt;strong&gt;Dismiss Changes&lt;/strong&gt; feature?&lt;/li&gt;
&lt;li&gt;Are you worried about abuse/misuse?&lt;/li&gt;
&lt;li&gt;Have you run into this conundrum yourself? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Lmk in the comments. And thanks for reading!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>Separation of Storage and Compute, Part Deux</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Sun, 23 Feb 2025 23:21:12 +0000</pubDate>
      <link>https://dev.to/aaronsteers/separation-of-storage-and-compute-part-deux-15g6</link>
      <guid>https://dev.to/aaronsteers/separation-of-storage-and-compute-part-deux-15g6</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: These opinions are mine and mine alone, not a reflection on my employer.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A bit of history
&lt;/h2&gt;

&lt;p&gt;The first "Separation of Storage and Compute" revolution started in 2010s, as all database platforms learned to scale up and down their compute independently from the underlying storage.&lt;/p&gt;

&lt;p&gt;The first to the market with separation of storage and compute Spark in 2009 and SparkSQL in 2014, building on the Hadoop platform and promising extreme portability with the ability to run SQL against virtually any storage medium. While SparkSQL was open source and while it showed the world that decoupling storage and compute was possible, Spark failed to deliver in the categories of ease of use and ubiquity.&lt;/p&gt;

&lt;p&gt;Snowflake launched in 2014 around the same time as SparkSQL, and a delivered better, more user-friendly experience - with built-in separation of storage and compute. Snowflake is internally architected as a managed data lake that "feels" like a traditional database - with auto spin-down of compute on &lt;em&gt;by default&lt;/em&gt;. This means users can pay just for the compute they needed, with dirt-cheap storage backed by S3. But unlike Spark, Snowflake is not open source and can only be run via paid account with Snowflake. This soon becomes a non-negligible cost optimization problem for its customers, and now Snowflake compute costs represent &lt;em&gt;the&lt;/em&gt; primary limiting factor to Snowflake data warehouse scalability.&lt;/p&gt;

&lt;p&gt;SQL Server, Redshift, and others similarly follow along in the "separation and storage and compute" revolution, and the benefits of this first generation of compute and storage isolation meant that you as a user could equally scale up &lt;em&gt;and&lt;/em&gt; down according to your query needs, with a &lt;strong&gt;"near-zero always on cost"&lt;/strong&gt;. If you need a lot of compute, you can spin it up on demand and run it only as long as you need it. For workloads that scale linearly, you can run 100 CPUs for 1 minute instead of running 1 CPU for 100 minutes - literally 100x performance for the same cost! And because there's no limit to how many compute workers you can spin up in the Cloud, contention between queries is non-existent and it's literally impossible for the warehouse to become overloaded or "too small" for your scaling requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second revolution is here
&lt;/h2&gt;

&lt;p&gt;Today we are seeing a second revolution of separation of storage and compute, which is separation of the &lt;em&gt;vendor&lt;/em&gt; you use for compute and the &lt;em&gt;vendor&lt;/em&gt; you use for storage. Now, you can connect your BI tool to your lake &lt;em&gt;without&lt;/em&gt; spinning up a Snowflake cluster. You can migrate from Databricks to Snowflake and back without paperwork and without any vendor lock-in.&lt;/p&gt;

&lt;p&gt;As an analogy, consider Apple Music with its DRM, vs DRM-free MP3s that you own free and clear. Every music app can read your MP3s but &lt;em&gt;no other music app&lt;/em&gt; can play your iTunes purchases. This limits your freedom and makes you think twice about where and how to buy your music. And similarly now for data: vendor lock in is a serious challenge for data engineers, and the lack of portability between architectures can easily become a multi-million dollar migration initiative for companies that want to move between platforms.&lt;/p&gt;

&lt;p&gt;This is not a knock on Apple or commercial Data Warehouse vendors - it's just an allegory for the revolution we are seeing today with the widespread acceptance and adoption of Iceberg. Now, your lake lives in the cloud and it's readable and writable by &lt;em&gt;every&lt;/em&gt; tool in your toolbox. Meaning, you can store data in Iceberg with the peace of mind that &lt;em&gt;every&lt;/em&gt; tool you buy off the shelf will be able to read and write to it freely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the impact
&lt;/h2&gt;

&lt;p&gt;To understand the impact of this new paradigm, just consider your situation: where you currently have vendor lock-in, and where you are paying vendors just for "SELECT *" access to your data...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is your org fully dependent on MS SQL and SQL Azure? No problem - it can read from Iceberg.&lt;/li&gt;
&lt;li&gt;Are you a hard-core Spark enthusiast? Again, no problem - you can read and write in Iceberg, reading or writing with Spark on Iceberg, using whichever commodity hardware or commercial service you prefer in that moment.&lt;/li&gt;
&lt;li&gt;Does your BI tool want to query data every day at 5am, but you don't want to pay Snowflake just for being an intermediate "SELECT *" compute passthrough? No problem. Just bypass Snowflake entirely and have your BI tool read directly to Iceberg.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it means for database service providers
&lt;/h2&gt;

&lt;p&gt;In short, for database service providers like Snowflake, MS SQL, Redshift, and Spark - they have to make the case that they are the compute you &lt;em&gt;want&lt;/em&gt; to use. Emphasis on great UI/UX, great performance, and great features will make all the difference. And even still, they can no longer rely on being the &lt;em&gt;only&lt;/em&gt; or even the &lt;em&gt;primary&lt;/em&gt; query interface for their existing users. They should expect that their users will increasingly mix-and-match, and that their users will (smartly) bypass them in simple "SELECT *" use cases where there's no reason to pay for the compute spin-up. Wherever write operations are expensive or lacking features, they should expect users to mix-and-match write-providers as well, leaning on services - or self-managed commodity compute - that can write data cheaper or more effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means for application service providers
&lt;/h2&gt;

&lt;p&gt;While the rest of this article might seem like a "race to the bottom" in terms of pricing, there's another huge and positive impact that can be attained in this second revolution. That is, now every application, web service, service provider, and startup can now provide a &lt;em&gt;direct&lt;/em&gt;, &lt;em&gt;fast&lt;/em&gt;, &lt;em&gt;cheap&lt;/em&gt;, and &lt;em&gt;best-in-class&lt;/em&gt; data architecture for their users. Rather than leaning entirely on REST APIs, which are slow, cumbersome, and expensive to build+maintain, they can offer their users their own personal data lake. Free to query how the user likes, "zero-copy interoperable" with every major DB platform, and easily scalable &lt;em&gt;down&lt;/em&gt; to zero and &lt;em&gt;up&lt;/em&gt; to near-infinite concurrency.&lt;/p&gt;

&lt;p&gt;This last part is what gets me personally very excited about Iceberg and other data lake storage providers that transcend vendor lock-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you think?
&lt;/h2&gt;

&lt;p&gt;Do you share my enthusiasm, or do you think this is just more complexity in an already complex space? Are you worried about the race to the bottom, or are you excited (like me) that we'll soon all be free from vendor lock-in?&lt;/p&gt;

</description>
      <category>iceberg</category>
    </item>
    <item>
      <title>Quantum Computing and LLMs: Match Made in Heaven?</title>
      <dc:creator>Aaron Steers</dc:creator>
      <pubDate>Sat, 01 Feb 2025 04:07:55 +0000</pubDate>
      <link>https://dev.to/aaronsteers/quantum-computing-and-llms-match-made-in-heaven-35fp</link>
      <guid>https://dev.to/aaronsteers/quantum-computing-and-llms-match-made-in-heaven-35fp</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Quantum computers are amazing and fast but don't work for traditional computing. LLMs and amazing and slow, reliant on vector analytics, GPUs, and crazy amounts of compute power. Were these two destined for passion? were they forever destined to join forces and change everything, FOREVER??&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Large Language Models (LLMs) have revolutionized the way we process and generate human-like text. They power chatbots, coding assistants, search engines, and countless other applications. At the core of LLMs are large-scale vector computations: they leverage embeddings and transform multiple dimensions of data into vector spaces. This vector-centric foundation means that LLMs inherently function with some degree of approximation—sampling tokens, generating probabilities, and learning from fuzzy data distributions.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;em&gt;quantum computing&lt;/em&gt; has been the buzzword of the last few years when it comes to next-generation computing paradigms. Quantum machines promise exponential speedups on certain classes of problems, often those that require intense parallelism or optimization. They also naturally embrace phenomena like superposition and entanglement, which encode states in ways that classical bits simply cannot.&lt;/p&gt;

&lt;p&gt;But how do these two buzzworthy worlds intersect? The question arises: &lt;strong&gt;Are quantum computers the perfect implementation for LLMs and vectors?&lt;/strong&gt; Let’s dig in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vectors: The Lifeblood of LLMs
&lt;/h2&gt;

&lt;p&gt;LLMs like GPT, BERT, and others revolve around vector operations at their core. Here’s why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Embeddings&lt;/strong&gt;: Each token (word or sub-word unit) is assigned a vector of weights that capture semantic meaning.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Transformers&lt;/strong&gt;: The self-attention mechanism in Transformers repeatedly projects vectors into different subspaces, making billions—sometimes trillions—of vector multiplications per training iteration.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Approximation&lt;/strong&gt;: Many LLMs rely on approximate algorithms to speed up training (e.g., approximate nearest neighbor searches, low-rank approximations).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, &lt;em&gt;massive vector operations&lt;/em&gt; define the workload of LLMs. If a computing paradigm handles these huge vector and matrix multiplications efficiently—especially in an approximate sense—it becomes interesting for powering next-generation language models.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Failure Intolerance of Traditional Computing
&lt;/h2&gt;




&lt;p&gt;Classical computing is designed around the notion of &lt;em&gt;deterministic, precise&lt;/em&gt; operations. Every bit flip is a problem if unintended. At scale, you need advanced error-correction or you risk introducing subtle flaws that can derail entire computations. Of course, GPUs and specialized hardware (like TPUs) are extremely fast for matrix operations, but they still lean on deterministic outcomes.&lt;/p&gt;

&lt;p&gt;However, LLMs do not necessarily require absolute precision for every multiplication. Training and inference can be surprisingly robust to noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Noise in training&lt;/strong&gt;: Some degree of randomness or noise (like dropout, quantization, or approximate matrix multiplication) can even help generalization.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Approximate results&lt;/strong&gt;: Modern LLM pipelines often use half-precision or lower precision calculations—because “close enough” is generally &lt;em&gt;good enough&lt;/em&gt; for gradient-based learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, while classical computing seeks to minimize every error, LLMs thrive in a domain where &lt;em&gt;some&lt;/em&gt; error is acceptable as long as the overall performance is strong.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Quantum Computing and Approximation
&lt;/h2&gt;

&lt;p&gt;Quantum computing, in its current forms, faces the challenge of being prone to errors (due to decoherence, imperfect gate operations, etc.). We’re in the &lt;strong&gt;NISQ (Noisy Intermediate-Scale Quantum)&lt;/strong&gt; era, which means systems are relatively small and noisy. Advanced error-corrected quantum computers are still on the horizon.&lt;/p&gt;

&lt;p&gt;At first glance, this might seem problematic for large-scale matrix operations. But interestingly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Approximate Algorithms&lt;/strong&gt;: Quantum algorithms often produce approximate answers with a certain probability distribution. This might naturally align with LLM architectures, which already operate probabilistically.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quantum Parallelism&lt;/strong&gt;: Quantum bits (qubits) can, in theory, represent multiple states simultaneously. This could lead to more efficient ways to process huge vector sets or to sample from complex probability distributions (core to LLM next-token sampling).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Variational Circuits&lt;/strong&gt;: Already popular in quantum machine learning, these circuits aim to find parameter sets that optimize a certain objective—very reminiscent of training an LLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So rather than seeing noise as an irredeemable flaw, the LLM space might view it as a &lt;em&gt;feature&lt;/em&gt;, or at least a &lt;em&gt;manageable limitation&lt;/em&gt;. If the final result is “good enough,” that might be enough. “Perfect” is not always necessary for language generation tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why “Good Enough, Very Fast” is Actually Perfect in Vectors
&lt;/h2&gt;

&lt;p&gt;Vector-based applications—be they LLM embeddings or neural network layers—are especially forgiving for near-enough solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Dimensional Redundancy&lt;/strong&gt;: High-dimensional embeddings often encode overlapping or redundant features. A small error in one dimension can be compensated by signals in others.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Probabilistic Outcomes&lt;/strong&gt;: LLMs produce distributions over the next token. It’s about capturing the &lt;em&gt;shape&lt;/em&gt; of that distribution, not necessarily nailing every micro detail.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Efficiency Gains&lt;/strong&gt;: Minimizing the exact floating-point error at scale can be computationally prohibitive. If quantum systems can solve or approximate high-dimensional vector operations more efficiently, that’s a big win.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, the approximate nature of quantum hardware could align well with the approximate nature of LLM computing tasks—especially as we push vector embeddings to ever-larger scales.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The (Big) Challenges
&lt;/h2&gt;

&lt;p&gt;While the synergy sounds great on paper, there are still some big caveats:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Hardware Scalability&lt;/strong&gt;
Quantum devices are still limited in qubit count, gate fidelity, and coherence times. Training a large-scale LLM on a quantum computer is nowhere near feasible with today’s hardware.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Error Correction Overheads&lt;/strong&gt;
True fault-tolerant quantum computing is an active research area. Error correction schemes require many additional qubits to encode a single “logical qubit.”&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Complexity of Implementation&lt;/strong&gt;
Even if we can do approximate calculations, designing and implementing a quantum-based LLM pipeline is extremely non-trivial. Tools, frameworks, and mental models are still evolving.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Cost and Accessibility&lt;/strong&gt;
Quantum systems are expensive and specialized. Cloud-based quantum computing might help, but it’s still not as plug-and-play as a GPU-based environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Quantum ML Tools to Explore
&lt;/h2&gt;

&lt;p&gt;If you’re curious to explore quantum machine learning in a hands-on way, consider checking out some of the emerging frameworks and libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://pennylane.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;PennyLane&lt;/strong&gt;&lt;/a&gt; (by Xanadu) – A platform for differentiable quantum computing, letting you integrate quantum circuits into machine learning workflows.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://qiskit-community.github.io/qiskit-machine-learning/" rel="noopener noreferrer"&gt;&lt;strong&gt;Qiskit Machine Learning&lt;/strong&gt; (by IBM)&lt;/a&gt; – Tools for building and training quantum ML models using Qiskit’s quantum simulators or real hardware.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.tensorflow.org/quantum" rel="noopener noreferrer"&gt;&lt;strong&gt;TensorFlow Quantum&lt;/strong&gt;&lt;/a&gt; – A quantum extension of TensorFlow that facilitates hybrid quantum-classical machine learning experiments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you’re not ready to dive into production-grade quantum computing, these libraries are great for experimenting with smaller-scale quantum ML concepts.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Pathways to Quantum-LLM Hybrid Approaches
&lt;/h2&gt;

&lt;p&gt;We may not see a pure quantum LLM tomorrow, but in the meantime, hybrid approaches are emerging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hybrid Classical-Quantum Workflows&lt;/strong&gt;: Run classical steps (like data preprocessing or embedding) on CPUs/GPUs, then offload certain optimization or sampling tasks to a quantum coprocessor.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quantum-Inspired Algorithms&lt;/strong&gt;: Some research in “quantum-inspired” linear algebra methods is already benefiting classical HPC (e.g., random projection, approximate matrix factorization).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Approximate Nearest Neighbor on Quantum Hardware&lt;/strong&gt;: Vector search is core to semantic retrieval for LLMs. If quantum systems excel at certain approximate similarity calculations, that might become the first big application.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So, &lt;strong&gt;are quantum computers the perfect implementation for LLMs and vectors?&lt;/strong&gt; LLMs thrive on approximate computations in massive vector spaces, and quantum computing intrinsically deals in probabilistic, error-prone paradigms. The synergy of “good enough, very fast” lines up very well with both the promise and constraints of quantum hardware.&lt;/p&gt;

&lt;p&gt;As quantum technology matures, we’ll likely see incremental integrations and specialized workflows rather than a total quantum takeover. Quantum computers fail "gracefully" in a domain where perfect accuracy isn’t the ultimate goal is a compelling argument for their future role in powering sophisticated language models and other vector-heavy, approximate tasks.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Are there quantum-inspired ways to speed up your vector operations today? Have you experimented with quantum frameworks or approximate solutions in your LLM projects? Feel free to share your insights in the comments below!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy coding!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
