Tales from the jar side: End of semester, Splitting PDFs, Spring AI versions, Kotlin notebooks, some personal stuff, and the usual toots and skeets
Sugar is the only word in the English language where "su" sounds like "sh". I'm pretty sure that's correct. (rimshot)
Welcome, fellow jarheads, to Tales from the jar side, the Kousen IT newsletter, for the week of April 27 - May 4, 2025. This week I taught my regular schedule at Trinity College (Hartford).
End of Semester Stuff
Now that I’m a professor at Trinity College (in Hartford, not Dublin, not San Antonio, nor any of the other dozens of similarly named colleges and universities around the world), late April and early May has a bigger meaning than it used to for me. This was my last full week of classes in the semester, so most of the activity involved finishing up.
My Senior Seminar class involved seniors, as you might guess. They automatically cared, because on Thursday we had our big seminar presentations. That meant each student or group presented their research project for the year in a ten-minute block, with a few awards coming from our sponsor from the Travelers insurance company.
My original plan was to give my own presentation early in the semester, in order to demonstrate what I thought would be good practices, but here’s the thing — I never give talks that are 10 minutes or less. On the No Fluff, Just Stuff tour, all my talks were 90 minutes, so that became a comfortable pace for me. At other conferences, the normal presentation time is about an hour, or sometimes only 50 minutes. That’s hard for me. I never do anything shorter than that, however.
(I was going to include here the famous quote: “If I had more time, I would have written a shorter letter,” which most people attribute to Mark Twain, but checking the origin of the quote sent me down a rabbit hole. Suffice it to say basically every author has said something like that at one time or another.)
Instead, I let the students do their talks in class during the semester, and I gave as much feedback as possible. I mostly concentrated on the slides and presentation skills. The technical content I left to the individual faculty advisors. As part of my role with the Entrepreneurship Center, I took on many more student projects than anyone else on the faculty, though, and I met my own students individually every other week.
Suffice it to say that the talks went quite well and a reasonably good time was had by all.
As for my other class, on Artificial Intelligence, we spent the semester working through Sebastian Raschka’s book Build a Large Language Model From Scratch. It turned out in order to understand what was going on, we had to spend the first four weeks of the semester digging through the author’s online course on deep learning. Raschka provided Jupyter notebooks for everything, which we executed in class.
The book really is low level. Every trick used to improve performance or optimize efficiency is included, which we were mostly able to skip in favor of the concepts. That meant the students didn’t really create their own LLMs. They mostly ran the ones that Raschka generated. Does that mean they learned the concepts? I don’t really know. I think so, but I guess we’ll see. I was pleased, however, that we were able to finish the entire book this semester, so at least they know what the whole story looks like.
On Wednesday I have to give a final exam in that class, but I expect that to be fine. That’s because it’s open book / open notes / open AI, so they’ll probably generate as many answers as they need. But, then again, I’m generating as many questions as I need, too, though I do go over and evaluate them all. Eventually we’ll be able to cut out the middleman and just have their AI models take my AI-generated test and the rest of us can go home.
Okay, that’s a bit too cynical, even for someone like me who has a very low regard for the value of grades. Students obsess over them way too much, but that’s not surprising given that the whole system is designed around them. I remember reading that any time you make a metric into a goal, the metric loses all value. Another way to say the same thing is that any time you set up a reward, people will learn to game the system to earn it. The truth is that I have no idea how to fix this mess, and I certainly don’t have the energy to do it even if I did. There was an article in the New York Times about a month ago on how bad grade inflation has gotten (as I recall, it said 83% of all Yale students had an A average), and with the exorbitant cost of college tuition these days and the shaky state of the economy, I don’t have the heart to make grading too difficult. I try to assure them that after they get their first jobs, nobody will ever ask their grade point average ever again, which probably feels hard to believe, but it’s true. In fact, it’s the people who bring up their own college GPAs years later that you have to worry about.
Of course I remember my own, because I was just as focused on it as any college student or more. All I’ll say is it got me into graduate school, and nobody cared after that. I remember my father saying the old joke, “what do they call the person who graduated last in their class in medical school? Doctor,” and that’s always stuck with me.
I guess that means that if I were a football coach, my teams probably wouldn’t be at the top of the rankings, but I can live with that. The world is tough enough for this generation without me applying some harsh artificial value judgement on top of it. I do give them the best quality information I can, and I try to show them how hard I work to keep up with everything going on these days, so hopefully that’s leading by example.
Is this all an elaborate rationalization for laziness? Maybe. I’ll try to do better next semester.
A PDF splitter, or over-splitter
Speaking of learning, I did another tiny project this week with those AI agent tools I’ve been discussing: Claude Code and OpenAI’s Codex CLI. I wanted to feed that entire AI book into Claude Code and ask questions about it, but of course it’s too long for that. (It’s not too long for Gemini, but I’ll try that later.) I figured I’d split the pdf into individual files for each chapter, and fired up Claude Code to help.
That worked pretty easily, but that’s where I have to apply some judgement. For example, the AI didn’t include any test cases, and that’s just bad. So I encouraged that, and we iterated around them for a while until I had something I thought was good. Then I ran the overall system on the book pdf, but instead of the seven chapters I expected, the code generated 88 (!) separate files.
It thought every section and every subsection were separate “chapters”, which is a great illustration of how AI’s don’t really “get” what you’re trying to do. I shut down Claude Code and fired up Codex CLI on the same project. I had Codex make a new branch (so I could undo any changes if it got ugly) and fix the problem. Once I had that working, I went back to Claude Code and asked it to review the code in the new branch. It agreed that the new code was fine, so I merged it back into main.
What did I learn about parsing and generating PDFs? Not a whole lot. The code used the PDF Box library from Apache, and I was able to follow it, but that’s a very low level library I don’t care about very much, so again I was happy to let the AI tools do the work.
Once again, in the back of my mind I feel guilty about all this, but if I’d had to do this project a few years ago, I either would have found a utility somebody else wrote, or just abandoned it. At least this way I got the job done and got more experience playing with these agents in the process.
FWIW, I’m teaching a training class on the O’Reilly Learning Platform on Claude Code in early July, so all this effort is building up experience for that. I’m in the process of proposing a similar course on Codex CLI, so hopefully that’ll happen soon as well.
Spring AI
This week I’m teaching another training course (also on the O’Reilly Learning Platform) on Spring AI, and, sure enough, the team released a new version (1.0.0-M8) just to mess up all my existing code. I shuddered, knowing the last few times that happened, it took me hours to fix the problems resulting from their API changes. This time, however, the blog post announcing the new version mentioned they had an OpenRewrite recipe to do it for you.
I’d heard about OpenRewrite, but never used it. As their documentation says:
OpenRewrite is an open-source automated refactoring ecosystem for source code, enabling developers to effectively eliminate technical debt within their repositories.
It consists of an auto-refactoring engine that runs prepackaged, open-source refactoring recipes for common framework migrations, security fixes, and stylistic consistency tasks – reducing your coding effort from hours or days to minutes. Build tool plugins like the OpenRewrite Gradle plugin and the OpenRewrite Maven plugin help you run these recipes on one repository at a time.
The idea is that developers provide migration tools that work automatically in your build. The Spring AI people provided a recipe here, which I used as a Gradle task. You create a file called init.gradle
, add in the code they tell you, run the command specified on that page, fix the results (it missed changing the actual version number, but that’s easy enough to update manually), and everything worked. Since I was only migrating from 1.0.0-M7 to 1.0.0-M8, I was happy with it. A couple of my tests failed, but they had issues before that I hadn’t yet fixed, and now I have.
According to the Spring Release Calendar, Spring AI 1.0.0 will finally (finally!) be released on May 20. I’ll believe it when I see it, but it could happen.
Kotlin Notebooks
JetBrains, the company behind the IntelliJ family of tools, published a blog post about their Kotlin Notebook support. Since I spent all semester playing with Python (i.e., Jupyter) notebooks, I had to try it out. It worked, more or less, though it kept generating errors and asking me to report them.
I’m always surprised how flaky the Kotlin support is inside IntelliJ IDEA. Maybe I’m using too late a version of Java for the underlying Kotlin compiler, or maybe it’s something else. I have to decide about which language to use (Java or Kotlin) in my Software Design course next fall, and if this part works well, it’s a point in Kotlin’s favor. I’m not convinced yet, though, and the “official” Kotlin training materials I used last year were really bad.
Personal
I thought I’d mention a couple of personal notes, just as miscellaneous info for anyone interested.
I’ve attended and performed at two separate funerals in the past month, the most recent one yesterday. I suppose that’s inevitable when you get to my age. The sad part is that the same family was involved in both losses.
My son’s birthday is tomorrow, and he turns 33. Yes, I have a son in his 30’s. We mostly text these days (I think that’s a generational thing), but after the Golden State Warriors get eliminated tonight — which I fully expect; Houston is simply a better team — we’ll see how much that continues as the NBA playoffs go on.
My wife and I are doing a re-watch of Severance, since she didn’t see it the first time around. It’s very interesting watching it again and seeing the clues as they come up. We’re almost done, and then we’ll have to wait until the next season like everyone else. Praise Kier, I guess, or not.
I really like my new car, which I mentioned a couple weeks ago. I’m especially happy to be out of the Tesla game, so I no longer need to worry about whether that company will even survive. It makes me laugh that people think Elon spending more time there is going to help rather than hurt. I also saw the news items about that Chinese company that can charge a battery from 0 to 80% in five minutes (!). We’ll see how long the US can keep that out of here, or whether they can adopt the same innovations.
On Saturday evening, May 17, my wife and I are performing in a so-called “Broadway Extravaganza” at First Church in Glastonbury, CT, as the last event in their Music In The Meetinghouse series for the year. We’ve got some solos, duets, quartets, and more. If you are in the area, let me know and I’ll send you a flyer. :)
Toots and Skeets
Hopeless nerdery
I meant to say “hysteresis loops,” but I figured the correction would be even nerdier than the original post and that was a bridge too far.
Meg, too
I meant to send this to Margaret, my editor at Pragmatic Programmers, but maybe she’ll see it this way. Snicker.
Mother’s Day is coming
That never really happened to my wife, but it would have been fine if it had. I always got along well with her mother. It’s my own mother who had, shall we say, issues.
(If my sister turns into her, shudder.)
Gee, Yogi, Mr. Ranger wouldn’t like that
Approaching him would be a … Boo-Boo.
Lessons from Tom Gauld
After all these years, I still struggle to convert passive voice to active.
Hey, that’s mine, too
My high school years were spent in York, PA. Every summer we took a family trip to Gettysburg. We got to see the wildly exciting “electric map,” which was exactly what you think it was. It had light bulbs that lit up to show the progress of the battle. We did climb around a bunch of rocks, though.
The most positive thing I remember from those family trips was the year we listed to the soundtrack from The Muppet Movie traveling both there and home. Still a classic.
Low standards
Hey, if I caught myself without falling after doing that, it definitely would go in the win column.
Not much of a code
Actually, that’s inspired. The dwarves have to speak Elvish to get into their own mines. I’ll bet the elves were all lmao about it.
Finally, a song reference
We hope you will enjoy the show, with a little help from your friends.
(Wait, where’s Ringo? In the back, I guess.)
Have a great week everybody!
Last week:
My regular schedule at Trinity College (Hartford)
This week:
Spring AI, on the O’Reilly Learning Platform
Final exam at Trinity College (Hartford), and I’m done for the semester.