Python for Reading
or why we don't need to be computer scientists to code
When I was in graduate school, history PhDs needed to pass two different language exams. Now, I am American, so you might imagine that I’m probably better in English than in other languages, and you would be right. I started taking German in seventh grade (because the Spanish teacher yelled at me in the hallway once in sixth grade). In all my other classes, I was a very good student, but in that class, I barely passed. I bumbled in this way through high school, basically being an excellent student except in German. Poor Herr Lyon-Vaiden. He was such a kind man.
When I went to college, I had to complete through the fourth semester of a foreign language. Guess how that went? I took the placement test and placed out of just one semester of German, and only because I begged. At this point, I was about six years in. So I took three more semesters of German, struggling all the way. When I got to graduate school, I took the placement test in German, figuring I could do this. I had a dictionary next to me!
I failed the test.
I swore that I would never spend another minute of my life studying German. So I picked up a book called French for Reading.
This book was unlike any text I’d ever seen in German. Instead of trying to get me to buy pants at the mall—which was something I had no interest in talking about in English—it started with ideas. I read about philosophy and art, science and history. I actually care about those things. French for Reading gave me new words to understand new ideas that did not exist in English. I was learning new ideas (not just learning how to shop in a different language).
In about six weeks studying this book, I took the French exam, and I passed. Now, I did pass the German test on my second try (but I swore I was going to learn Spanish before I learned any more German).
But the larger point here is that when you learn a new kind of language with a goal in mind rather than just doing what you ordinarily do, it can be actually quite exciting. It wasn’t that I was bad at German; it’s that I was bad at German for going shopping at the mall.
So I’m sure that many of you are anxious about programming. But this moment is not about programming—it’s about using code to understand the past in new ways.
The other thing that was amazing about French for Reading was that it was just for reading. I don’t have a musical ear. I definitely don’t have a good ear for accents or languages. But somehow I could learn to read French in six weeks. I can’t write French. I can’t speak French. But if I go to a museum, I can, even decades later, read the wall labels.
So when I think about AI, I think, Python for Reading.
A main objection to “vibe coding“ is that the user doesn’t actually understand what is happening, which, of course, would be bad. The argument here is that if you don’t write the code, you can’t understand—or critique—the code. I don’t believe that for Python anymore than I believe that for French. Do writers understand a language better than readers? Sure. Does that mean that readers have no understanding? No.
Python, in particular, is a very human-friendly language to read (unlike assembly). With a little training, a reader can understand what is happening in the code and think through its gaps. While I can write Python, my understanding of Python is far larger as a reader than a writer.
More importantly, my understanding of what Python can do, and how it ought to be done, has little to do with whether I remember a particular bit of syntax. In the era of AI, those high-level ideas—abstraction, encapsulation, data contracts, robustness, pipelines, etc.—matter much more (though you should know about indentation).
And those ideas are the equivalent of learning about French philosophy rather than German shopping. We all love ideas. That’s our thing. And if we lean into our curiosity, we can do amazing things with this new technology.
The goal is not to become a computer scientist. The goal is to make novel, interesting, creative, curious, and human arguments about history. The computer will write the code to answer your questions.
Just as you don’t need to be a linguist to write, you don’t need to be a computer scientist to code.
After a few weeks, you will not write Python at all. You will write history.




I would add a nod to the classic K&R book on C as the definition of a clear and concise programming text. No one has done a better job since, and often the opposite with 1000+ page tomes coming in and out of fashion. I would love to have a book like this about Python- the best is probably Beazly.
Refs:
https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628
https://www.amazon.com/Python-Essential-Reference-David-Beazley/dp/0672329786/ref=sr_1_2?crid=2TV8H9D8KXUJH&dib=eyJ2IjoiMSJ9.3KrVmM5Q4kyZXomQcxTyv_cmavEkUyF2MKJoKevQE06oRUFhKOUj2bi8h1OzCmXQLBVJQPTGGp1PWKHNPW6kAtRyKJQ1S29_NNGFfdwgsck1B3g83Bd-sz0QDZPOt5p_DQIIlQs0_GIUN1y64rbf1oIojRrmlIE52tc2mTJ7O10rK1pQTvqFAiEcsFGFiJIsyj71NVb7uoZlxsS5SIak4hfbL3tQRR4vGJyIgGauKRg.BM5L-8r7oBqRdGbYj5LbXC-o_cMpgNYhLOvgWW3Q7x0&dib_tag=se&keywords=python+beazly&qid=1776873235&s=books&sprefix=python+beazly%2Cstripbooks%2C105&sr=1-2
I find that as I adjust to llm-supported historical research I am acquiring meta-linguistic skills. Yes, I understand the basics of Python, JSON, React... But infinitely more important is to understand conceptually architecting, designing, building and testing as process flows.
At a higher level of generalisation, we have included six of Jordan Rubin's metacognitive skills in our history-skills repository: anthithesize; dimensionalize; excavate; inductify; negspace; synthesize. Now we have to figure out how to adapt them to historical research use cases.
https://github.com/ai-and-history-collaboratory/history-skills-repository [message me with your GitHub ID if you would like access]