python in the room: bread & circuses or meaningful way forward
Working on selling my mom’s home in New Jersey I reached out to an electrician and a radon remediation guy on Thumbtack. It is quick and easy and it can be immediate. I need someone on Tuesday so let’s see who is available. I don’t need the service in North Carolina because if your house is over one hundred years old not only do you have your team assembled but somehow many have even morphed into friendships.
But here is the thing. Now I am noticing Thumbtack add placement sprinkled through my socials. Somehow a query on my laptop has traveled deep and wide so here we are.
What else, what else? Oh yeah. I discovered the relaxing chill of Persian jazz while I am working. So much so that any digital platform dissipates the sounds like perfume as I walk through the house. I am becoming “known” but how much of my privacy is now commoditized?
How can we beat back this individualization that we haven’t specifically asked for but it seems here to stay. Sameness is not a secret sauce or an upside to anyone in the creative space. Unless you have boring as one of your business objectives.
My idea is to hand illustrate when possible and manually publish my next book. The expectation isn’t perfection but I want something humanly flawed and uniquely my own.
A few years ago I wrote a book featuring Python and geospatial data discovery. What I theorize as responsible for keeping the book relevant is the timing. I remain grateful that I am routinely invited to speak at workshops and conferences. Drop a pin in a print book about technology arriving on the cusp of almost ubiquitous digital access. Let’s face it, the book is unexpectedly perfect for this time of vibe coding. Seems like a stupid thing to say but hear me out. When I wrote it I did not have any interest in learning Python from soup to nuts — hello world? No thanks. I was trying to survive in geospatial analytics with my R coding credentials but things in my universe were no longer tidy.
An executive program in Applied Analytics from Columbia University and the Fu School of Engineering was solely in Python and I already was writing stuff down into a notebook to keep up. There were many books steeped in Python — my idea was just to bring the necessary background so we could start using the amazing Python geospatial libraries. If you look at the table of contents you will notice that each chapter is basically a pillar of spatial analysis by way of an introduction.
Now we are in modern vibe coding, AI assisted realities. Foundationally speaking, if I could convince everyone to learn at least one coding language before embarking on shortcuts I would. If either of the first two books had been a more positive experience I would write an update. Python is an incredible tool for the 3D environments and tools like Blender, QGIS, and Unreal Engine. But the route of traditional publishing, at least for tech books, is not something I wish to repeat. The dialectical here is it was a wonderful experience but simultaneously not a great one.
As an invited keynote for the Leadership Summit I have a choice to make. Do I rage against the machine that is AI or do we figure out a way forward? My cooler head prevailed and my goal is to share a few insights from the podium and explore dynamic story telling workflows in real time.
Meanwhile I am sorting through ideas I hope to share from the podium. The stuff we stopped caring about to our own detriment.
The essential bits
Let me begin by stating I am not a professional developer. Python is a tool. A way for me to build the stories I want to tell so what might seem obvious to you may not be obvious to me. But if only developers are allowed into the conversation, what’s the point.
Understanding dot notation
attribute operator ( . ) is foundational to understanding Python and unifies how you interact with the coding language.
When you write obj.name, under the hood, Python is calling,
type(obj) .__getattribute__(obj,”name”)The double underscore (dunder) methods, or magic methods, provide a method for you to define the behavior of your objects. And everything is an object. I will keep repeating this so queue the drinking game if that keeps it interesting.
Dunder is behind every dot access searching for attributes in a precise order known as the Method Resolution Order (MRO) lookup chain. When you write ( flower.name ), where does Python go to find name and in what order? That’s the job of the MRO, a pre-computed ordered list of where to look stored directly on the class. A class is a container for your data definitions and function definitions.
obj.__dict__ # 1. Instance dictionary
type(obj).__dict__ # 2. Class dictionary
*base_class.__dict__ # 3. Parent classes (via MRO)
If it is unable to locate anything, the getattribute raises AttributeError unless you have getattr defined as a fallback.
Every dot access passes through __getattribute__ Its default implementation encodes the lookup strategy. It lives on the object. In Python, everything is an object and every object has a type.
You never call __getattribute__ yourself. The dot does it all.
The dot can access instance attributes (the data stored on the object), methods (functions that are descriptors on the class) and class & static attributes (these are shared across all instances), module attributes (these are objects), and nested/chained access (left to right).
Everything in python is an object and the dot is how they communicate with each other.
I left a lot out but the important highlight here is to point out a cautionary tale for vibe coding. Claude defines vibe coding as when we direct an AI to write logic and trust the output. You are describing intent, accepting the code, running it and iterating on errors. It goes on to say “This works until it doesn’t. And when it stops working, the failure mode is not a clean error message. It’s something far more dangerous. code that runs, produces output, and is silently wrong.”
Herein lies the problem. Every dot is a question you are asking and it is being answered. If you don’t understand the dot notation you are unable to reason. What do you do when the shape of your data changes?
I focused on AttributeError because this is the most common type of AI-generated code error. It seems the AI solution pops up almost magically offering a way out, even if you unwittingly summoned the assistance.
Each dot is a lookup that can fail if any object in the chain is missing, None or the wrong type. If you don’t understand this, you are completely blind to why this breaks. You paste the error back into the AI, get a patched version, and the bug moves one dot to the right.
This cycle can go on indefinitely. You are not fixing the problem. You are relocating it.
The most harmful error involves variable shadowing. This is when you define a variable in the inner scope (locally) that has the same name as a variable in the outer scope (globally). It doesn’t produce an error instead it silently overwrites or variable shadows the attributes. Basically you have wrong behavior that looks right but it isn’t.
Take home message.
To create architecture is to put in order. Put what in order? Function and objects.
Le Corbusier
something, as extravagant entertainment, offered as an expedient means of pacifying discontent or diverting attention from a source of grievance.—Dictionary.com
“Bread and circuses“ (or “bread and games“; from Latin: panem et circenses) is a metonymic phrase referring to superficial appeasement. It is attributed to Juvenal (Satires, Satire X), a Roman poet active in the late first and early second century CE, and is used commonly in cultural, particularly political, contexts. — wikipedia, (https://en.wikipedia.org/wiki/Bread_and_circuses)






