I just got added to the list of speakers who’ll be presenting at the Arc of AI conference, which takes place April 13 – 16 in Austin, Texas!
Arc of AI is the premier AI conference for deep technical talks on everyone’s favorite two-letter field. If you’re one of these kinds of people interested in AI…
Software developer
Architect
Data engineer
Technology leader
…and you want to learn the latest strategies, tools, and practices for building AI-powered applications and boosting your development workflows, with AI, this is your conference!
The early bird ticket price is $799, but that lasts only until this Saturday, March 14th. It goes up to $899 until April 4th, after which the price becomes $999.
Tampa Bay AI Meetup is a community partner of Arc of AI, and we can help you save $50 off the ticket price! Just use the discount code TampaBayAIMeetup when checking out.
Vibe coding, a term coined by Andrej Karpathy, is where where developers use natural language prompts to have LLMs or LLM-based tools generate, debug, and iterate on code. Vibe coding is declarative, because you describe what you want.
Grind coding, my term for traditional programming, where you specify how a program performs its tasks using a programming language. Grind coding is imperative, because you specify how the thing you want works.
I myself have been writing code for different purposes, on different parts of this spectrum (see the diagram at the top of this article for where they land on the spectrum):
The Tampa Bay Tech Events utility: This is the Jupyter Notebook I use to gather event info from online listings and build the tables that make up the event listings I post every week here on Global Nerdy. I wrote the original code myself, but I’ve called on Claude to take the tedious stuff, including analyzing the obfuscated HTML in Meetup’s event pages to find the tags and classes containing event information.
MCP server for my current client: This is a project that started before I joined, and was written using a code generation tool. The client is a big platform connected to some big organizations; my job is to be the human programmer in the loop.
Picdump poster: Every week, I post “picdump” articles on the Global Nerdy and Accordion Guy blogs. Over the week, I save interesting or relevant images to specific folders, and the picdump poster utlity builds a blog post using those images. It’s a low-effort way for me to assemble some of my most-read blog posts, and it’s more vibe-coded than not, especially since I don’t specialize in building WordPress integrations.
Copy as Markdown: Here’s an example of using vibe coding as a way to have custom software built on demand. I wanted a way to copy text from a web page, and then converting that copied text into Markdown format. This one was purely vibe-coded; I simply told Gemini what I wanted, and it not only generated the code for me, but also gave me instructions on how to install it.
If we have a term like “vibe coding,” where you build an application by describing what you want it to do using natural language (like English) and an LLM generates the code, we probably should have an equal opposite term that’s catchier than “traditional coding,” where you build an application using a programming language to define the application’s algorithms and data structures.
I propose the term grind coding, which is short, catchy, and has the same linguistic “feel” as vibe coding.
Having these two terms also makes it clear that there’s a spectrum between these two styles. For instance, I’ve done some “mostly grind with a little vibe” coding where I’ve written most of the code and had an LLM write up some small part that I couldn’t be bothered to write — a regular expression or function. There’ve also been some “most vibe with a little grind” cases where I’ve had an LLM or Claude code do most of the coding, and then I did a little manual adjustment afterwards.
Because some people asked, and because I’m going to be busy for the next day (I’ll explain later), here are more shots from recently-added pages to my notebook. These are notes on RAG and LangChain, taken and condensed from a couple of books, a couple of online sources, and my own experimenting with code. Enjoy!
A lot of the drudgery behind assembling the “Tampa Bay Tech Events” list I post on this blog every week is done by a Jupyter Notebook that I started a few years ago and which I tweak every couple of months. I built it to turn a manual task that once took the better part of my Saturday afternoons into a (largely) automated exercise that takes no more than half an hour.
The latest improvement was the addition of AI to help with the process of deciding whether or not to include an event in the list.
In the Notebook, there’s one script creates a new post in Global Nerdy’s WordPress, complete with title and “boilerplate” content that appears in every edition of the Tech Events list.
Then I run the script that scrapes Meetup.com for tech events that are scheduled for a specific day. That script generates a checklist like the one pictured below. I review the list and check any event that I think belongs in the list and uncheck any event that I think doesn’t belong:
Click to view the screenshot at full size.
In the previous version of the Notebook, all events in the checklist were checked by default. I would uncheck any event that I thought didn’t belong in the list, such as one for real estate developers instead of software developers, as well as events that seemed more like lead generation disguised as a meetup.
The new AI-assisted version of the Notebook uses an LLM to review the description of each event and assign a 0 – 100 relevance score and the rationale for that score to that event. Any event with a score of 50 or higher is checked, and anything with a score below 50 is unchecked. The Notebook displays the score in the checklist, and I can click on the “disclosure triangle” beside that score to see the rationale or a link to view the event’s Meetup page.
In the screenshot below, I’ve clicked on the disclosure triangle for the Toastmasters District 48 meetup score (75) to see what the rationale for that score was:
Click to view the screenshot at full size.
For contrast, consider the screenshot below, where I’ve clicked on the disclosure triangle for Tampa LevelUp Events: Breakthrough emotional eating with Hyponotherapy. Its score is 0, and clicking on the triangle displays the rationale for that score:
Click to view the screenshot at full size.
One more example! Here’s Tea Tavern Dungeons and Dragons Meetup Group, whose score is 85, along with that score’s rationale:
Click to view the screenshot at full size.
I don’t always accept the judgement of the LLM. For example, it assigned a relevance score of 40 to Bitcoiners of Southern Florida:
Click the screenshot to view it at full size.
Those of you who know me know how I feel about cryptocurrency…
…but there are a lot of techies who are into it, so I check the less-scammy Bitcoin meetups despite their low scores (there are questionable ones that I leave unchecked). I’ll have to update the prompt for the LLM to include certain Bitcoin events.
Speaking of prompts, here’s the cell in the Notebook where I define the function that calls the LLM to rate events based on their descriptions. You’ll see the prompt that gets sent to the LLM, along with the specific LLM I’m using: DeepSeek!
Click to view the screenshot at full size.
So far, I’m getting good results from DeepSeek. I’m also getting good savings by using it as opposed to OpenAI or Claude. To rate a week’s worth of events, it costs me a couple of pennies with DeepSeek, as opposed to a couple of dollars with OpenAI or Claude. Since I don’t make any money from publishing the list, I’ve got to go with the least expensive option.