May 2026

Contrivance

Contrivance1 is a lost art. In the past, a student effortlessly invents a story. My dog eats my homework. My seventh grandmother passes away. Creativity is boundless.

Today, a student relies on artificial intelligence for creativity. When he invents a story about why he misses class, the contrivance is insipid and transparent. Is it artificial intelligence who invents the contrivance? Or is it a student so unaccustomed to deception that his contrivance lacks any art? Or is it a student who so relies on artificial intelligence that his very sense of art lacks any creativity? Who knows?

Even a professor who avoids artificial intelligence is lost. When he lacks a clever student who invents a boundless story, his very sense of deception passes away. Thus, a student who relies on artificial intelligence invents contrivance insipid yet not transparent. Thus, a student who lacks creativity still passes his class.

1. This musing, from start to end, is a carefully crafted contrivance to produce a text which can be tractably analyzed and emulated through a manual exercise in natural language processing. The odd tone of the musing is explained by the need to avoid unwanted complexities like homonyms (the same sequence of letters conveying conceptually distinct words) and inflection (the conceptually-same word appearing with distinct sequences of letters due to conjugation, declension, etc.).

May 2026

"We must teach computer science in prison"

The latest issue of the Communications of the ACM had arrived in the mail, and on its cover was an image of a man in faded coveralls, arms oustretched toward an idyllic blue sky. Between the two was a network of dark lines, straight and crooked, a double entendre serving as the prison bars which separated man from the freedom to explore God's creation, while simultaneously evoking the image of an integrated circuit. "We must teach computer science in prison" were the words overlaid on the bars, yellow and bright as the sun.

"Oh, wow, Emma made the front cover." That was my first thought. Somehow I knew, without opening the periodical, that the author of the cover article was Emma Hogan Benser, an assistant professor at Bard College. That certainty was followed by a torrent of emotions difficult to articulate, but worthy of reflection.

First came pride, the sort of stodgy and undeserved self-adulation you feel when you brush with celebrity. How special that I, so new in my field and so early in my career, had met the author of an ACM cover article at a conference just three months before. How special that I had interacted with her, at the birds-of-a-feather discussion session on teaching computing in prison which Prof. Benser had co-led, to a sufficient extent that I could recognize her work at a glance. Yay "me".

Second came a sort of shame, a collective shame of the whole field of computer science and academia in general - that I instinctively knew the work belonged to no one else. How incriminating. Oh, there surely are other computer scientists who teach computing in prison. I met some of them: three professors led the birds-of-a-feather. But only one had zeal.1 There are not a few professors who serve their time in prison, drawn in directly or indirectly by Christ to effect His work of mercy. But as Prof. Benser points out in her cover article, "the majority of faculty who teach in prison do so in addition to their normal course load, and many on a volunteer (unpaid) basis!" These professors make a great gift of their time and their love. But few have embraced that work of mercy as a vocation.

Thus the third emotion: an overwhelming sense of responsibility. I experienced a visceral glimpse, as its namesake would say, of the greatness of the mission of our Moreau College Initiative. It is held up by all who know it as among the best of its kind. There is hardly any better place in the whole of the nation to offer oneself up for the most underserved and underestimated population in our nation. Here I am, by the grace of God, in spite of my being so new in my field and so early in my career, the academic director of computer science at Holy Cross College. Prof. Benser has raised the rallying cry, "we must teach computer science in prison." Who has a greater call to answer it than me?

1. This is certainly hyperbole. E.g. Prof. Benser would not be who she is today had not her mentor, who was co-leading the session, made it his own vocation before her. But it is true that it was the fire in Prof. Benser which gave the session meaning, and it is true that I did not think for one instant that anyone else might have written the article.

Feburary 2026

A first encounter with losing my job, or my mind

As a postdoc in a physics department with a strong coding background, I was pretty oblivious to all this generative AI mumbo-jumbo. Perhaps I have a latent irrational allergy to the stuff, but I tend to code things out at the same rate that I decide how I want them coded out - and that is usually faster than my fellow physicists - so I never encountered any existential pressure to realign my values with the times.

Now I'm teaching computer science, and it's a bit more relevant. But before we even begin to worry about how to use AI to code efficiently, students need to learn how to code in the first place. So I still haven't thought about it much, and even now I pride myself on having actually no idea what the interface to "Chat GBD" or whatever it's called looks like. I don't typically have an Internet connection when I'm coding something up in my bed at home anyway, so it's not like I could use it even if I knew how.

Well, one night, I sat up in my bed and wrote out the skeleton code for a data structure I was about to assign as homework. And then the next morning, I brought my computer to my desk, plugged the Internet in to check emails. With half an hour to spare before class, I finally checked my notes from last time I'd taught the course, to see if I'd left anything out. I had: a contains method. I went back into my code, desperate to have it ready in time, and started typing out the javadoc comment in the interface file. I hit the enter key, and I was just about to start typing out the method header, when I became aware that it was already on my screen. Italicized. An auto-complete suggestion. A rather more complete auto-complete suggestion than I was used to, and also, ah, unlike usual, accurate to what I was about to type.

It was then, and only then, that I discovered my VS Code editor had somehow gotten in its head that it should be using GitHub's AI Copilot, without actually clearing the idea with me first.

A bit flummoxed, I ignored it and went into my class file to type out the implementation for the new method. Actually, I just copy/pasted the method header from the set method, changed the name to contains, and then … and then the code that I was about to type out leapt unbidden onto my screen. Oi vei. I took some time to stare at it in aghast horror. It wasn't just an implementation of contains. It was my implementation of contains. Character for character, exactly what I was about to type. It used my style. My preference for whitespace. My using the this keyword even when it wasn't necessary. Character for character. I felt this horrible mixture of feeling honored and being made redundant at the same time.

But, something didn't look right. I kept staring at the method, until I saw it - there was an extra parameter, an index, in the method header. "Not perfect," I thought with relief… until I remembered that I had copy-pasted the method header from the set function. I had done that, and simply hadn't gotten around to trimming it out. The copilot had graciously overlooked my incompleteness and come up with the exact method I wanted, even one that any linter worth its salt would reject for having an unused parameter. I didn't know how to feel about that.

Still, that was the Vector. Backed by an array. Pretty standard stuff. People write methods for arrays containing something all the time. A little freaky it knew to use my size attribute and not the buffer length but fine. It's a common enough and straightforward enough assignment that a Large Language Model would have plenty of data to work with for Vector implementations. Linked lists are no less common, but a bit more complicated. How is it going to manage this one? I copy the method header from Vector and paste it into List. And the rest of the method springs up. Complete with cursor, with while loop, data-check, return. Everything. My choice of variable name. My choice of loop structure. Which, I realized, was all the more astonishing because so far in this file, I had wound up using for-loops for everything. I never used the cursor variable name with a while loop. It was the right choice for this particular function. It had mapped out every single character, letter for letter and space for space, that I would have, assimilating perfectly my style with the standard solutions for object-oriented list structures. Oi vei.

But there was one more task, updating my skeleton code, the unfinished version of the code I actually give to students. Hah. Let's see it do this one. I'll type in the method header, and it will just give me an implementation for the method. Then I'll have to get rid of it and type a TODO comment instead. I go into the file. I copy a javadoc from another method, which (slightly inappropriately) only says "refer to the interface file". Nothing to even change; the javadoc is identical for all these in the skeleton code. Not even a name of the function to distinguish them. I hit the enter key. I'm about to type in the method header, naming the function contains. I don't get the chance. The whole bleep-ing method leaps onto my screen. Letter for letter. With the header that I had not yet typed. The to-do comment, no implementation. The dummy return value. Everything.

Except, curiously, the closing brace. I had to put my cursor at the end of the method for that last character to spring up. What. The. bleep.

In the last seconds before leaving for class, I realized I hadn't written any tests for the new methods. Naturally, as soon as I started typing in the main method, this copilot inferred exactly what I was after and filled it out perfectly. Its error statement displayed the message "FAIL: list.contains({value}) is not {expected}". Mine would have said "FAIL: list.contains expected value {expected} for value {value} but got {actual} instead". The copilot's version was objectively more concise, less redundant. I changed it to my version. Out of principle? Out of stubborness? Out of spite? Yes.

January 2026

We just cannot get around a posteriori science

There is a longstanding competition between the fields of philosophy and natural philosophy - of understanding the world through interior principles, or through external observation. The debate has raged throughout history: Plato's a priori vs Aristotle's a posteriori, Descartes's rationalism vs Locke's empiricism, psychology's introspection vs behaviorism, theoretical vs experimental physics. Of course, humanity is a result of both, and physicists of either today will aver that their mode of discovery is entirely dependent on the other. But it's still a competition.

The idea of a Grand Unified Theory is deeply rooted in the heart of every theoretical physicist. We acknowledge that, epistemologically, we might need experiments to be sure the theory is correct, but in every other sense, the theory is philosophically prior. The mathematical world of this Grand Unified Theory explains the physical world of human observation.

We do not have any Grand Unified Theory - or more precisely, we have many, which is just as bad - but we do have Quantum Field Theory, which is quite close. It predicts the most fundamental interactions of nature across an astonishing breadth of scale to an astonishing degree of precision. It consists in just a few Platonic postulates, appealing only to notions of symmetry, yet the laws of classical mechanics, electrodynamics, quantum mechanics, special relativity, and (presumably) statistical mechanics are all implicitly contained within them. Quantum Field Theory is universally recognized among physicists as the single most successful physical theory of all time. In principle, with enough patience and enough hard-drive space, you could compute a series of integrals and derivatives to describe the status and motion of any kind of matter.

With one small exception.

One of these integrals, the one which computes the mass of a particle, diverges to infinity. That's not right. It does not hinder the theory in the slightest! If you simply replace the divergent integral with the empirically measured mass,1 everything is pixel perfect from then on: the virtual particles, the scattering potentials, the transition functions, all of it! But it all rests on this single a posteriori detail, the mass of a particle.

Quantum Field Theory is the single most successful physical theory of all time, the coup de grâce of theoretical physics. Yet even here, we are humbled, forced to concede - for now - that it is the physical world which explains the mathematical.

1. I'm reducing the sophisticated mathematical process of renormalization to something farcical, but only becuase I don't know any better. If you read up on the topic, you will find arguments that renormalization can be understood from first principles, and that it is integral to how we articulate mathematical truths across multiple scales. I would like to explain this thoroughly, since I have the strong intuition it makes the thesis of my musing even clearer... but at present it flies quite over my head!