June 1st, 2026
Yesterday I was reminded of a common failing in machine learning algorithms that again suggests they aren’t really thinking or understanding. Possibly it points to the lack of a world model. Here’s a nice little photo I caught of a bird in its environment:

Do you see the bird? Do you know what it is? (If you’re not a birder, I’ll give you a hint. It’s an American Kestrel.) This isn’t an especially tough or complicated ID once you spot the bird sitting on the pipe. I could have cropped it in closer, but I sort of liked the environment in this one.
And here’s what the rather good iNaturalist machine learning model suggested:
Read the rest of this entry »
Posted in AI | No Comments »
May 31st, 2026
AI limitations I’ve noticed lately:
* Gemini can’t render the math for a Taylor series on an iPad
* Github Copilot, with any of the models it supports, can’t run my tests because VSCode can’t handle JUnit 3
* Gemini doesn’t know if it’s running in AI Studio or on an iPhone so it gives me instructions that only work in the Gemini web app.
These are all solved problems. What’s going on here? Are the LLMs not actually intelligent? Are they intelligent but not effective? Are they blind? Is this just a temporary glitch, or is there some more fundamental limitation here?
Read the rest of this entry »
Posted in AI | No Comments »
April 30th, 2026
Lately I’ve heard developers claim that it’s now OK to avoid specifying the character set when creating an InputStreamReader or String, or otherwise converting bytes into characters because Java now (JDK 18 and later) uses UTF-8 as its default character encoding regardless of platform.
Except we do still need to do it, for two independent reasons:
Read the rest of this entry »
Posted in Java | No Comments »
April 6th, 2026
I’ve released version 1.4.0 of XOM, my open source library for processing XML with Java. It’s available from the usual places including Maven Central (xom:xom:1.4.0) and https://xom.nu/. This is the first release coded with LLM assistance.
Read the rest of this entry »
Posted in AI, Java, XML | No Comments »
March 13th, 2026
Often in a code review I’ll point out that public signatures are being changed, and we can’t do that in a minor release. Then the author will reply that it’s OK because it’s an internal only API, or an impl API, or both so it’s OK. No one is depending on it. And then this happens:
Error: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.14.0:compile (default-compile) on project mvnd-daemon: Compilation failure
Error: /Users/runner/work/maven-mvnd/maven-mvnd/daemon/src/main/java/org/mvndaemon/mvnd/syncontext/DaemonNamedLockFactoryAdapterFactoryImpl.java:[48,9] no suitable constructor found for NamedLockFactoryAdapterFactoryImpl(java.util.Map,java.lang.String,java.util.Map,java.lang.String,org.eclipse.aether.impl.RepositorySystemLifecycle)
Error: constructor org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl.NamedLockFactoryAdapterFactoryImpl(java.util.Map,java.util.Map,java.util.Map,org.eclipse.aether.impl.RepositorySystemLifecycle) is not applicable
Error: (actual and formal argument lists differ in length)
Error: constructor org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl.NamedLockFactoryAdapterFactoryImpl(java.util.Map,java.lang.String,java.util.Map,java.lang.String,java.util.Map,org.eclipse.aether.impl.RepositorySystemLifecycle) is not applicable
Error: (actual and formal argument lists differ in length)
Error: -> [Help 1]
Hyrum’s Law applies. From JLBP-3:
Read the rest of this entry »
Posted in Java | No Comments »