There is no royal road to geometry

they say that Ptolemy once asked him if there was in geometry any shorter way than that of the elements, and he answered that there was no royal road to geometry

I was discussing with an educator friend about one hour last afternoon. I also deliver vocational training classes, but for me it is not my main source of income.

The discussion revolved around how one can incorporate AI into the lectures / lessons / notes and the like. I told him that when I give Kubernetes courses, I am not afraid to tell people to reach for the chatbox and ask things. Kubernetes is so vast, that it is almost impossible to remember it all, what is current, what is deprecated (or scheduled to be) and people in introductory courses need to learn about specific patterns, but they always come up with use cases one is not prepared about. So reach for the chat bot. Read the relevant documentation on kubernetes.io and evaluate the response.

When discussing teaching programming languages though, things become different. People can (or “can”) vibe code complete applications without even knowing how to write a single experssion in the target language. They become easily frustrated with the fundamentals, and wildly bored if you ask them to write a vesion of fizzbuzz (even though there can be good discussions about it). As Ron Minsky puts it:

And now all you need is a prompt and a dream and you can for free create a plausible looking problem.

I told my educator friend that we need to explain to people that even Harry Potter needed training. And we need to find a way to show this to people. Much like in the movies, it is not only to speak out the spell (prompt), you need to understand it deeper; and yes we still need to understand the fundamentals. Because again, as Ron Minsky says:

But it’s still hard work to verify that it makes sense. And you don’t want to add lots of things to a system that will make it overall messy and complicated. Even if the code is good, it might be that it makes the system that you’re building conceptually complicated for the end user. If everyone gets every knob that they want, you just get too many knobs.

For sure the vocational training landscape is changing. I have seen blog posts and newsletters from people that this was their business discuss how revenue fell sharply:

Now it feels like developers have an infinite amount of resources at their fingertips. Not only can they ask for advice on any topic, they can now get samples to go along with any request, ask AI to explain existing code, and so much more. AI might not always have the best advice, and it will make mistakes from time to time, but overall it feels like a net positive to not ever feel as truly stuck as I did many times when I was first learning to code.

Unfortunately, this all comes with a cost.

In my case, it meant that the number of sales I make on my XXXX courses has been steadily declining.


It is not that hard to ask your LLM to assume a teaching persona and start you on a learning path for some subject. I have done it. And I am fairly certain that relevant skills have been developed for LLMs already. To a certain extent this whole situation may make us better educators. Those of us who decide to stick around.

Because, at least for now, there is still no royal road to a better prompt.


I am using the term prompt loosely to describe the whole thing: prompt, caching, compaction, agents and their swarms.

A generalist’s time LLMed

In Time Management for System Administrators by Tom Limoncelli, there is advise against becoming extra specialized on a technology, since highly specific issues are to be solved by the vendor and not you. That is unless you’re working for the vendor. Then you do need to become highly specialized on the product.

(Although there are vendors who say “if you know the name of the product we sell you ad an expert; if you’ve read the manual as a guru” – true story)

Sometimes I feel the same way when I am pasting tons of output to Claude, using it as a better grep with inference to mitigate issues with software I can’t possibly find time to get comfortable with.

lv1.sh

The essay from lv1.sh starts with

Twenty-five years with k and q. I did not want a new language. I wanted to rebuild the engine underneath it.

This hit me really hard for two reasons:

  1. I have an on and off relationship with K an Q since 1998 when a friend first showed it to me. But I have not really invested much time in it. However, early versions of K were written by Arthur Whitney in something like 100 lines of (very idiomatic) C code. And as someone else said, “Well, if he did it in 100 lines, maybe I ca not it in around 1000 lines”. Which is a belief I also share. I never really did.
  2. I have a thing for interpreter implementation (I know my limits and where a hobby should stop). I have a number of books on DSLs and interpreters (notably Ramsey‘s and Kamin‘s), but really nothing to show beyond reading about them. I also understand that I do not have a vivid programming language design imagination. So at best all I care is a working interpreter, not even an optimized one.

But alas, I do not have 25 years on the technology I want to copy. And a couple of other mistakes too.

Anyways, to continue self-inflicting pain on me:

#alias q='rlwrap ~/q/m64/q'
#export PATH=~/.kx/bin:$PATH
alias q=~/src/q/l_m64

Maybe I will redo the first chapters from Nick Psaris‘s books using L.

Happy Sysadmin Day

Projecting the current trends, future software will consist of a synthetically generated code.  No one will have the foggiest idea what is in that code.  Somewhere in the basement of MegaCorp will be a huge computer file with the listing of that code.  The last sysadmin will sit beside the file, handcuffed to the disk drive like a scene out of “Ben Hur.” That engineer will be extremely well paid, and his or her every demand will be immediately satisfied.  That engineer will be the last keeper of the secret of the universe: reboot

Paraphrasing an article I very much like.

 

software calligraphy – part 2

As a systems administrator I am used to stitching together other people’s code and systems to produce a working outcome within given constraints. Which means, the rise of agentic coding should make me happy. Alas, outside work, it seems to make me sad. Which is why I still discuss my saddening experience with friends, coaches and mentors.

A professor friend posted on Facebook part of Moshe Vardi’s article:

CS departments must also grapple with the fact that the most fundamental skill we used to teach, which is coding (remember “Coding for All”?), may not be a viable skill at all.

To which I responded something along the lines of: Professors teaching circuits and computer architecture, do teach students how the components connect, but there is no person in the world, for decades now, who does this on their own for VLSI and the like. It is just not possible. They rely on the computer to do that. And yet, the skill of designing chips is not lost. We are there.

So what I call software calligraphy (hand crafted code) is the skill Dr. Vardi thinks is not the viable one. Yes, a calligrapher aims at a niche market. But to be honest, I do not think any of the 65 courses I had at NTUA taught me code as a viable skill. Maybe at Rice they did things differently (with Racket, HTDP and the like).


I woke up thanks to a nightmare this morning. I could not sleep. But here is what I remembered:

One morning I was shopping in Amsterdam with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path. As I said, it was a twenty-minute invention. In fact, it was published in ’59, three years later. The publication is still readable, it is, in fact, quite nice. One of the reasons that it is so nice was that I designed it without pencil and paper. I learned later that one of the advantages of designing without pencil and paper is that you are almost forced to avoid all avoidable complexities. Eventually, that algorithm became to my great amazement, one of the cornerstones of my fame.

This is Dijkstra describing his famous algorithm. And he did not do that in front of a computer. Hell, there was no way to be in front of a computer at the time for as long as we do now. It made me realize that I (and possibly others) had replaced any notation, pen and paper with the keyboard and the programming language. As I told another friend in our morning coffee, I had replaced thinking with pen and paper with C and pointers. It is as if we express unformulated thought by writing (and editing to bring it in order) code, and because the LLM writes code faster, we get saddened because we do not have time to think, when it should have been our thought, and not our query, guiding the LLM.

No algorithm was typed in the computer first (for certain definitions of “no”). I had this discussion back in 2006 with Aris. I told him, “I feel I can solve any problem you can pose to me by thinking in code”. “All right”, he said calmly, “solve graph isomorphism”. Yup, he is still waiting for my solution.

So the thing is this: I need to approach my interactions with the LLM in a way that does not outsource the thinking to it. Only the typing. And use more drawings and paper (I am no Dijkstra to be able to do without). This, I hope, will bring back my recreactional computing joy. And maintain fine motor skills.

software calligraphy

or What objecting to LLM agents teaches you about you (sometimes)

There was a small positional game that I’ve wanted to implement for some years, long before the LLMs and their agents became a thing. I did not have the time. By now we know that using an LLM shrinks this time demand. So I went this way to implement the game. Sure enough, it was done within the day. But was it the result I longed for?

I was not happy. Because through this endeavour I found out that I wanted to solve the game myself. I wanted to understand the algorithm and think through whether I figured out the best solution, or written the best idiomatic code I could. I wanted the journey. I wanted to do software calligraphy; I did not want to build a product. I felt sad. All the thought that would have brought me joy was outsourced to the machine.

Now had I wanted to make the game something worthy of Steam or any other Store, would I feel sad by the same speed of delivery? Most likely not. Because my mindset would have been one for product building, not calligraphy or recreation. And this is part of what gives certain people discomfort when using new tooling: the deep need to do calligraphy when you’re asked to make a product that does not need it anymore. Prior the wider LLM acceptance you could do calligraphy at work. And you could earn bragging rights from it. This is not the same world anymore.

There is still room for both, but with LLMs the border becomes harder to ignore.

[ This is the summary of a phone conversation I had with a friend when we were discussing the subject of using agents at work; including people who accept whatever they produce without any judgement. ]

Open Weight models and soft power

I see Open-weight AI models as a form of digital soft power. When an entity releases their models for free public use, they aren’t doing this operating under an altruistic motive; they’re aiming at shaping global perception: users get to run the latest (or the best for their hardware) model for free, but in return, they accept all the biases embedded in the model. For sure one could argue that the same holds true for search engines and even encyclopaedias, but encyclopaedias don’t hallucinate, the search results usually will point you to many competing analyses on what you’re looking for (otherwise SEO would not have been a thing) and users tend to accept answers easier due to the anthropomorphization.

This makes the open weight models a new strategic battlefied in the soft power arena. You do not have to run any long play PSYOP or even a tourist advertising campaign. You can have the free model say the thing and concentrate your efforts into making the users run the thing on their machine. Running it locally feels more “free” both in cost and dependency.

I foresee a near future with shareware models. The same companies giving us open weight models for free, are going to give us the new ones for a fee (training costs real money) and you will either subscribe to this service to get the latest model, or use the free one that will be two versions older. Which for most cases is going to be okish for the end user. Special purpose models, for writing code for example, will have the single user and the enterprize version, with maybe the enterprize version being fluent in more languages, or being aware of more libraries for your agents to work in an enterprise environment, as opposed to the indie game that you’re trying to push out.

We’ve seen the pattern: open-access allowing for an ecosystem to arise (see Kubernetes as the latest example), proprietary extensions capturing value. But with GenAI models, the issue is greater: The biases aren’t just in code; they’re in how the model serves truth, morality, and reality. Leading you to accept the producer’s perception one token at a time.

adventures with meshcore-cli

I have a good friend who is into meshcore. Seeking to expand the network he participates in, he asked me if I could host a repeater on the rooftop, to which I agreed.

He also gave me a little companion to connect so that I could also test and participate if I liked. The companion (a Heltec v3) was configured to use Bluetooth, but weirdly enough it was not searchable by my Apple devices and my Kubuntu device could pair with it, but could not actually use it. So I flashed it as a USB companion instead. Which now bore the question: How do I use the thing?

With a little help from Perplexity, since I knew nothing about Meshcore until this time, and it was not in my interests horizon, here’s how you can use a meshcore USB companion from the command line:

  • You install the Python meshcore and meshcore-cli packages, preferrably in their own dedicated Python environment. You now have a meshcore command at your disposal
  • You plug in the companion. Locate where it is available (dmesg maybe?). Mine was recognized as /dev/ttyUSB0. You can now connect to it with meshcore /dev/ttyUSB0
  • You are greeted with a prompt and you can now start searching for repeaters to connect to. Before you do that, you need to set the time on the companion (it does not read your computer’s clock). So take the output from date +%s and at the companion prompt type time 1780814625 (actually the epoch you get).
  • Now you can set the name (set name my_companion) of your companion and send a flood advertisment (floodadv) to be discovered.

My friend also proivided me with a meshcore:// URL and a password to be able to connect and manage the repeater. So I used import_contact meshcore://... and then used list to check whether the contact was imported. Sure enough it was there. Using login contact_name password I was able to send commands to the repeater. The most important one in our case was to set the flood interval: cmd contact_name "set flood.advert.interval 6".

If all goes well, you can wave hello to the other in the public channel with public Hello, World and watch the screen of your terminal as the rest wave back at you.

I don’t know whether I’ll stay involved in this thing, but it was a fun excursion.