Categories
Artificial Intelligence Humor

Meme of the moment (RAM prices and AI)

This one’s going in Saturday’s picdump:

Since there are precious few RAM manufacturers and that consumer RAM isn’t where the big money’s at (Micron is closing Crucial, their consumer RAM branch, from whom I bought my most recent RAM stick), most of the production is now being aimed at AI and enterprise data centers, meaning RAM shortages for us ordinary folk.

Long story short: If you think prices are bad today, wait a few months. If you can, buy RAM now, but Consumer RAM Winter is coming.

In case you need some context for the meme above, here’s the scene it came from — probably the best scene in Iron Man 2, apart from “Sir, I’m gonna have to ask you to exit the donut.”

Categories
Meetups Players Presentations Programming Tampa Bay

Notes from Venkat Subramaniam’s presentation on finding and fixing code with AI (Monday, December 8, 2025)

It’s always a treat to see one of Dr. Venkat Subramaniam’s presentations, and Monday evening’s session, Identifying and fixing Issues in Code using AI-based tools, was no exception!

On behalf of the Tampa Bay Artificial Intelligence Meetup, Anitra and I would like to thank Ammar Yusuf, Tampa Java User Group, and Tampa Devs for inviting us to participate in this meetup, and to thank Venkat for an excellent lecture.

Here are my notes and photos…

Part 1: What AI actually Is (and isn’t)

Think of AI as “Accelerated Inference”

  • The reality check: The term “Artificial Intelligence” is misleading. It suggests that an application has sentience or wisdom. Venkat suggests a more accurate definition for AI: Accelerated Inference.
  • Inference vs. intelligence:
    • If you see a purple chair and then another purple chair, you infer that chairs are purple. That isn’t necessarily true, but it is a logical conclusion based on available data.
    • AI does this on a massive scale. It doesn’t “know” the answer; it infers the most statistically probable answer based on the massive volume of data it was fed.
  • Speed vs. accuracy: Machines are “wicked fast,” but they are also error-prone. Humans are slow and error-prone. AI allows us to make mistakes at a much higher velocity if we aren’t careful.

Karma

  • Garbage in, garbage out: AI models are trained on billions of lines of code, most of it written by humans (at least for now).
  • The problem: Humans write bugs. We write security vulnerabilities. We write bad variable names.
  • The consequence: Because AI learns from human code, it learns our bad habits. Venkat says this is karma. When we complain about AI writing bad code, we’re really complaining about our own collective history of programming mistakes coming back to haunt us.
  • The takeaway: Don’t assume AI output is “production-ready.” Treat AI-generated code with the same skepticism you would treat code copied from a random forum post in 2010.

The “novice vs. expert ” paradox

Venkat described a specific phenomenon regarding how we perceive AI’s competence:

  • The novice view: When you ask an AI to do something you know nothing about (e.g., writing a poem in a language you don’t speak), the result looks amazing. You find it awesome because you lack the expertise to judge it.
  • The expert view: When you ask AI to do something you are an expert in (e.g., writing high-performance Java code), you often find the result “awful.” You can spot the subtle bugs, the global variables, and the inefficiencies immediately.
  • The danger zone: As a developer, you are often in the middle. You know enough to be dangerous. Be careful not to be dazzled by the “novice view” when generating code for a new framework or language.


Part 2: Strategies for using AI effectively

1. Use AI for ideas instead of solutions

  • Don’t ask for the answer immediately. If you treat AI as a maker of solutions, you bypass the critical thinking process required to be a good engineer.
  • Ask for approaches. Instead of “Write this function,” ask: “I need to solve X problem. What are three different design patterns I could use?”
  • Love the weirdness: AI is great at throwing out random, sometimes hallucinated ideas. Use these as inspirations or starting points for brainstorming. “Accept weird ideas, but reject strange solutions,” Venkat said.

2. Managing cognitive load

  • The human limit: We struggle to keep massive amounts of context in our heads. We get tired. We get “analysis paralysis.”
  • AI’s strong suit: AI doesn’t get tired. It can read a 7,000-line legacy function with terrible variable names and not get a headache or confused.
  • The “Translator” technique:
    • Venkat used the analogy of translating a foreign language into your “mother tongue” to understand it emotionally and logically.
    • Try this: Paste a complex, confusing block of legacy code into an AI tool and ask, “Explain this to me in plain English.” This helps you understand intent without getting bogged down in syntax.

3. The Δt (“delta t”) approach

  • Don’t “one-shot” it: Just as numerical analysis (calculus) requires taking small steps (Δt) to get an accurate curve, working with AI requires small iterations.
  • Workflow:
    1. Present the AI with the problem and ask it for possible approaches.
    2. Review its replies. Chances are that at least some of them (or maybe all of them) will be wrong, buggy, or not the answer you’re looking for.
    3. Don’t give up. Instead, provide feedback: “This code isn’t thread-safe,” or “This variable is null.”
    4. The AI will often correct itself. This back-and-forth “dance” is where the actual development happens.

Part 3: Code examples

Venkat demonstrated several scenarios where code looked correct but had problems that weren’t immediately apparent, and showed how AI helped (or didn’t).

Case study: Fruit

The first case study was a version of a problem presented to Venkat by a client. He couldn’t present the actual code without violating the client NDA, so he presented a simplified version that still captured the general idea of the problem with the code.

Here’s the first version of the code:

// Java

import java.util.*;

public class Sample {
    public static List stringsOfLength5InUpperCase(List strings) {
        List result = new ArrayList<>();

        strings.stream()
            .map(String::toUpperCase)
            .filter(string -> string.length() == 5)
            .forEach(result::add);

        return result;
    }

    public static void main(String[] args) {
        var fruits = List.of("Apple", "Banana", "Orange", "Grape", "Guava", "Kiwi",
                "Mango", "Nance", "Papaya", "Peach", "Lime", "Lemon");

        var result = stringsOfLength5InUpperCase(fruits);

        System.out.println(result);
    }
}

This version of the code works as expected, printing the 7 fruit names in the list that are 5 characters long.

Right now, it’s single-threaded, and it could be so much more efficient! A quick change from .stream() to .parallelStream()should do the trick, and the resulting code becomes

// Java

import java.util.*;

public class Sample {
    public static List stringsOfLength5InUpperCase(List strings) {
        List result = new ArrayList<>();

        //  Here's the change
        strings.parallelStream()
            .map(String::toUpperCase)
            .filter(string -> string.length() == 5)
            .forEach(result::add);

        return result;
    }

    public static void main(String[] args) {
        var fruits = List.of("Apple", "Banana", "Orange", "Grape", "Guava", "Kiwi",
                "Mango", "Nance", "Papaya", "Peach", "Lime", "Lemon");

        var result = stringsOfLength5InUpperCase(fruits);

        System.out.println(result);
    }
}

The code appears to work — until you run it several times and notice that it will occasionally produce a list of less than 7 fruit names.

Why did this happen? Because Java’sArrayList isn’t thread-safe, and writing to a shared variable from inside a parallel stream causes race conditions. But this is the kind of bug that’s hard to spot.

Venkat fed the code to Claude and asked what was wrong with it, and after a couple of tries (because AI responses aren’t consistent), it identified the problem: creating a side effect in a stream and relying on its value. It suggested using a collector like toList() to capture the the 5-character fruit names; it’s thread-safe.

Claude also suggested applying the filter before converting the list values to uppercase, so as not to perform work on values that would be filtered out.

The takeaway: AI is excellent at spotting errors that  we humans often miss because we’re so focused on the business logic.

Case study: Parameters

I didn’t get a photo of this code example, but it featured a function that looked like this:

public String doSomething(String someValue) {

    // Some code here

    someValue = doSomethisElse(someValue)

    // More code here

}

I’m particularly proud of the fact that I spotted the mistake was the first one to point it out: mutating a parameter.

Venkat fed the code to Claude, and it dutifully reported the same error.

It was easy for me to spot such an error in a lone function. But spotting errors like this in an entire project of files? I’d rather let AI do that.

Case study: Currency converter

I didn’t get a photo of this one, but it featured base class CurrencyConverter with a method convert(float amount). A subclass NokConverter attempted to override it to handle Norwegian Krone.

The problem was that NokConverter’s conversion method’s signature was convert(int amount), which meant that it was overloaded instead of overridden. As a result, polymorphism was lost, and the client code ends up calling the base class method instead of the subclass method. But that’s pretty easy to miss — after all, the code appears to work properly.

A quick check with the AI pointed out that the method was not actually overriding, and it also suggested adding the @Override annotation, which is meant to prevent this kind of subtle error.

Remember: don’t just let AI fix it; understand why the fix works. In this case, it was about strictly enforcing contract hierarchy.

Case study: Wordle

Venkat asked Claude to write a Wordle clone, and it did so in seconds.

But: the logic regarding how yellow/green squares were calculated was slightly off in edge cases.

AI sometimes implements logic that looks like the rules but fails on specific boundary conditions. It’s a good idea to write unit tests for AI-generated logic. Never trust that the algorithmic logic is sound just because the syntax is correct.


Part 4: The “Testing” Gap

Missing test suites

  • Venkat noted a disturbing trend: he sees very few test cases accompanying AI-generated code.
  • Developers tend to generate the solution and manually verify it once (“It works on my machine”), then ship it.
  • The Risk: AI code is brittle. If you ask it to refactor later, it might break the logic. Without a regression test suite (which the AI didn’t write for you), you won’t know.

How to use AI for testing

  • Invert the flow! Instead of asking AI to write the code, write the code yourself (or design it), and ask AI to:
    • “Generate 10 unit tests for this function, including edge cases.”
    • “Find input values that would cause this function to crash.”
  • AI is often better at playing “Devil’s Advocate” (breaking code) than being the Architect (building code).

Part 5: Takeaways

Job security in the age of AI

  • The Fear: “Will I lose my job to AI?”
  • The Reality: You will not lose your job to AI. You will lose your job to another programmer who knows how to use AI better than you do.
  • The “Code Monkey” extinction: If your primary skill is just typing syntax (converting a thought into Java/Python syntax), you are replaceable. AI does that better.
  • The value-add: Your value is now as a problem solver and solution reviewer. You’re paid to understand the business requirements and ensure the machine code actually meets them.

Adaptation is key!

  • Venkat used a quote commonly attributed to Charles Darwin (see here for more): “It is not the strongest of the species that survives, nor the most intelligent that survives. It is the one that is most adaptable to change.”
  • Action Plan:
    • Don’t fight the tool
    • Don’t blindly trust the tool
    • Learn to verify the tool
    • Shift your focus from “How do we write a loop?” to “Why are we writing this loop?”

Empathy and code review

  • When AI generates bad code, we analyze it dispassionately. When humans write bad code, we get angry or judgmental.
  • The Shift: We need to extend the “AI Review” mindset to human code reviews. Be objective. Find the fault in the logic, not the person.
  • AI has shown us that everyone (including the machine trained on everyone’s code) writes bad code. It’s the universal developer experience.
Categories
Design Hardware Humor Programming

The toaster from the “toaster programmer” joke of the 1990s is now real!

While doing Christmas shopping, I stumbled across the device pictured above — the Revolution InstaGLO R180 Connect Plus toaster, which retails for $400 — and thought: Do they not remember the “toaster programmer” joke from the 1990s?

In case you’re not familiar with the joke, it’s one that made the rounds on internet forums back then, as a sort of “text meme.” Here it is…


Once upon a time, in a kingdom not far from here, a king summoned two of his advisors for a test. He showed them both a shiny metal box with two slots in the top, a control knob, and a lever. “What do you think this is?”

One advisor, an Electrical Engineer, answered first. “It is a
toaster,” he said.

The king asked, “How would you design an embedded
computer for it?”

The advisor: “Using a four-bit microcontroller, I would write a simple program that reads the darkness knob and
quantifies its position to one of 16 shades of darkness, from snow white to coal black. The program would use that darkness level as the index to a 16-element table of initial timer values. Then it would turn on the heating elements and start the timer with the initial value selected from the table. At the end of the time delay, it would turn off the heat and pop up the toast. Come back next week, and I’ll show you a working prototype.”

The second advisor, a software developer, immediately recognized the danger of such short-sighted thinking. He said, “Toasters don’t just turn bread into toast, they are also used to warm frozen waffles. What you see before you is really a breakfast food cooker. As the subjects of your kingdom become more sophisticated, they will demand more capabilities. They will need a breakfast food cooker that can also cook sausage, fry bacon, and make scrambled eggs. A toaster that only makes toast will soon be obsolete. If we don’t look to the future, we will have to completely redesign the toaster in just a few years.”

“With this in mind, we can formulate a more intelligent solution to the problem. First, create a class of breakfast foods. Specialize this class into subclasses: grains, pork, and poultry. The specialization process should be repeated with grains divided into toast, muffins, pancakes, and waffles; pork divided into sausage, links, and bacon; and poultry divided into scrambled eggs, hard- boiled eggs, poached eggs, fried eggs, and various omelette classes.”

“The ham and cheese omelette class is worth special attention because it must inherit characteristics from the pork, dairy, and poultry classes. Thus, we see that the problem cannot be properly solved without multiple inheritance. At run time, the program must create
the proper object and send a message to the object that says, ‘Cook yourself.’ The semantics of this message depend, of course, on the kind of object, so they have a different meaning to a piece of toast than to scrambled eggs.”

“Reviewing the process so far, we see that the analysis phase has revealed that the primary requirement is to cook any kind of breakfast food. In the design phase, we have discovered some derived requirements. Specifically, we need an object-oriented language with multiple inheritance. Of course, users don’t want the eggs to get
cold while the bacon is frying, so concurrent processing is
required, too.”

“We must not forget the user interface. The lever that lowers the food lacks versatility, and the darkness knob is confusing. Users won’t buy the product unless it has a user-friendly, graphical interface. When the breakfast cooker is plugged in, users should see a cowboy boot on the screen. Users click on it, and the message ‘Booting UNIX v.8.3’ appears on the screen. (UNIX 8.3 should be out by the time the product gets to the market.) Users can pull down a menu and click on the foods they want to cook.”

“Having made the wise decision of specifying the software first in the design phase, all that remains is to pick an adequate hardware platform for the implementation phase. An Intel Pentium with 48MB
of memory, a 1.2GB hard disk, and a SVGA monitor should be sufficient. If you select a multitasking, object oriented language that supports multiple inheritance and has a built-in GUI, writing the program will be a snap.”

The king wisely had the software developer beheaded, and they all lived happily ever after.

 

Categories
Artificial Intelligence Current Events Reading Material What I’m Up To

Where Cory Doctorow’s line, “When life give you SARS, you make sarsaparilla,” comes from

Lately, a lot of friends have been telling me that they were listening to an interview with Cory Doctorow about his latest book, Enshittification, and heard him attribute this quip to me:

“When life gives you SARS, you make *sarsaparilla*.”

The YouTube short above tells the story behind the quote (which also appears in this old blog post of mine), which also includes a tip on using AI to find specific moments or quotes in videos, and a “This DevRel for hire” pitch to hire an awesome developer advocate.

Categories
Humor Work

Your “official unofficial” calendar for December 2025!

Calendar for December 2025, where December 1 - 5 is marked “Pretend to work,” the 2nd and 3rd work weeks are marked “Don’t even pretend anymore,” the first 3 Saturdays and 2 Sundays are “Say you’re going to start shopping for presents,” the 24th is “Actually start shopping for presents,” the 25th is half “Nostalgia!” and half “Destroy your body with food and alcohol”, the 21st through 30th are completely “Destroy your body with food and alcohol,” and finally, the 31st is half “Prepare for the inevitable disappointment of New Year’s Eve” and “Realize that you accomplished absolutely nothing in 2025.”
Tap to view at full size.

I was supposed to post this last Monday, but things got really busy really quickly (or was I pretending, as the calendar above tells you to?).

Categories
Business

On Netflix buying WB

Categories
Picdump

Saturday picdump for Saturday, December 6

Happy Saturday, everyone! Here on Global Nerdy, Saturday means that it’s time for another “picdump” — the weekly assortment of amusing or interesting pictures, comics,
and memes I found over the past week. Share and enjoy!


a-lot-goes-wrong-before-everything-goes-right


average-vs-senior-developer

bagelshare-app

balance-these-nails

biceps-abs-cpp

big-delay

cant-use-that-computer-for-word-anymore


client-wants-a-demo

coding-programming

commits

completely-fine-code-vs-new-feature

compression

consensual-file-deletion

copilot-license-spider-man

customers-will-say

development-styles

devs-trying-to-do-their-job

diagrams

docker-vs-works-on-my-machine

documentation-nobody-cares

doge-was-a-cyber-attack

doing-this-because-he-loves-it

dont-give-up

ending-lines

evolution-of-trash-icon

f-keys

flirting

front-end-always-has-been

git-commit-m

goddamn-oracle

going-on-break

gone-for-45-minutes

head-and-body-tags

home-office-gossip

i-write-code

if-potato-can-become-vodka

if-you-made-it-to-the-white-house-media-bias-page

jobs-as-infrastructure

keyboard-throne

languages-spoken-in-dreams

latest-stable-build

meta-layoffs

my-body-is-a-machine

object-object

openai-solution

peak-performance

pizza-party

programming-with-ai

question_to_tech_ceos

rebasing-for-eight-hours

respectable-programmer-vs-me

salary-pocket

sandwiches-and-peace-1

serverless

shift-is-over

showing-python-skills

signs-of-a-stroke

sk8r-boi

some-of-you-may-die

spotify-playlist-about-git

stop-doing-lisp

tester-and-developer

too-complicated

too-late-for-greg

use-usestate-useeffect

username-password

vibe-coder-watching-ai-ask-for-forgiveness

vibe-coders-get-the-bill

vibe-coding-vibe-debugging

vibe-coding

we-can-tell

we-need-a-slur

what-she-really-wants-for-christmas

when-a-custromer-is-talking

when-everything-is-code-debt

when-the-customer-is-yelling

when-your-code-is-good-but-doesnt-work

who-would-win

why-does-python-live-on-land

yummy-ai-slop