$ python -c "import this"
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
I discovered this early on in my programming journey and it helped set my philosophical trajectory. Over the years I’ve slowly grokked these items. But it was valuable to have a North Star even before I realized why they were important.
Interestingly, today this text reads not only as good advice for coders but also as good instructions for agents. Perhaps time to revisit those and make sure the spirit of these adages is captured there
The only thing I never liked about this is complex is better than complicated. Every once in a while there is a post with an “insight” on how they’re different, but it’s the same word! Naming things is hard, but I wish Tim found another word for one of these.
> There should be one-- and preferably only one --obvious way to do it.
Oh boy, that didn't age well for Python language did it? It matches with C++ in growing complexity of syntax features. With a couple dozen ways to write the very same algorithm.
To be honest I found this sentence to be beautiful and true for many years after working a lot with php and perl.
The mort important word in this sentence is obvious. There are many many many ways to do the same thing but working with python I found that mostly to be true, there is always an obvious, documented way (and not two of three!). Searching for a way to do something in perl, for example, was such a huge difference.
Python has never followed the Zen. The irritating way the language lets you use non-booleans in a boolean context flies right in the face of "explicit is better than implicit".
Among his various other works, it was Tim Peters along with Gary Robinson who turned pg's "A Plan for Spam" essay into the successful SpamBayes program: https://www.linuxjournal.com/article/6467 .
The reason that's especially interesting is that I was using an AI to write something that needed that functionality, and it spewed out that same Python code, which I recognized immediately. It was slightly modified with respect to naming and comments because, I assume, it was stored slightly imperfectly in the model's weights.
This concept of making the best use of any available data to infer useful probabilities seems like a crude form of some ideas behind current LLMs, BUT they (Peters, Graham, Robinson and Woodhead) were doing this work 20 years earlier.
Once upon a time I used to read all python-dev posts and bugs.python.org issues, so I got to follow (and get a feeling of knowing) these people I admired working and discussing together. Tim was always a favorite.
Another thing that made me feel close to him was his work on the Python Cookbook 2nd Edition, in which he (and other big names in the community) delightfully talks the reader through intricacies and insights of programming, "We read Knuth so you don't have to".
Watching Tim do his thing was a pleasure. He'd go from long, deep technical dives (that he'd make as approachable as possible) into comic relief and human connection in the fractional wink of an eye.
The brief interactions we had will always be cherished as high points in my Pythonista trajectory.
> Ack, on my keyboard I rebound the Tab key to something less annoying: it
deletes a random DLL from c:\Windows\SYSTEM\. OK, OK, version 0.0.2 caters
to stinking tabs. Patch follows.
Tim was one of the people who contributed to my love of the Python language eventually expanding to its entire community.
He was always so willing to foster discussion that nearly every interaction resulted in an improved understanding of some topic and a shared eagerness to try or learn more out something tangential that came up via digression. I never knew how many types of voting systems there were nor how extensively they are researched! He also reached out about a comment [0] I made a few years ago which made me feel less discouraged and more welcome.
Tim's writing style was greatly appreciated by myself and many others. What he had to say was often lengthy, to address reader assumptions or some nuance, but was written with such a jovial tone that it was rarely dull or inaccessible.
Gene Hackman's character in Heist says "I tried to imagine a a fella smarter than myself. Then I tried to think 'What would he do?'"
For me, Tim Peters was that guy. I first met Tim in person at the first PyCon at GWU where I rode an elevator with him and Barry Warsaw. Let me tell you, it was a wild ride. He was a genuinely really nice, smart, kind guy.
In the 1990s I was a novice developer, though I considered myself a hotshot because I was better than those around me in college and grad school.
I was an active participant in the comp.lang.python Usenet channel in the late 1990s.
I learned much from reading Tim Peters' posts. To many, including me, he was affectionately referred to as "Uncle Timmy."
One of the things I learned was that I still had much to learn about the art of programming.
Much of the little I know about numerical methods comes from reading his posts. It was fun to read his stories about Kendall Square Research and the (for me) old days of computing.
I remember posting questions about things I didn't understand, which he figured out and explained. [1]
I remember bringing up concepts I thought were specialized and esoteric, only to find that it was actually just my lack of experience. He gently corrected misapprehensions like mine. [2]
He wrote a lot on comp.lang.python. If I recall correctly, at the 7th International Python Conference in Houston, November 1998, there was Festschrift in his honor. He would use <wink> in his messages, and often end with something like "let's-hear-it-for-lambda-in-curly-assignment-stmts-ly y'rs - tim" (that's from the posting where he outlines the Zen of Python). I wondered if they were collected by looking for messages containing an '-ly' only to have Andrew Kuchling remind me about the "From" header. <wink>
[1] In one case, I was parsing a file format where a field was usually three spaces, but was sometimes an integer. I couldn't figure out why one parser was so much faster than the other. The answer was that one tested for three spaces first, and if that failed tested for the int, while the other did the int test first.
Yes, this is something a senior developer knows. I bring it up now to highlight how hotshot-me didn't have that experience, learned that experience, and learned it from someone who was kind about sharing his knowledge.
[2] I was doing bioinformatics back then, and learned about dynamic programming as way to do sequence alignment. I didn't think others knew about the technique, and thought I was bringing esoteric new information to the discussion. Uncle Timmy had used dynamic programming techniques for speech-to-text software at Dragon Systems, and politely pointed out it was more widely known. He also implemented Python's 'difflib'.
Among other places, Tim also wrote a lot on StackOverflow. He’d answer all kinds of questions, both from novices and experts.[0][1]
I like reading his answers. He always seemed to have something interesting to say, and his answers are kind, light-hearted, approachable and insightful.
Yesterday, out of nowhere I remembered Zen of Python and looked it up to refresh my memory. Prior to that I hadn't known who the author was, so when I saw Tim Peter's name I had a moment of realization that it's the same person who invented Timsort and the same person who was banned from python forums a few years ago for opposing arguing agains bylaw changes.
It feels surreal to learn about his death just the next day. RIP
Before I clicked into the link I mentally thought "Wait I hope it's not the guy who invented Tim Sort". Very sad. Trying to retain hope that newer generations of Python folks will keep the zen of Python alive but especially in an agentic era, to some degree that hope does feel less and less realistic by the day.
I have the Zen of python printed out on our office wall and everyone quotes it at least weekly. It started as a bit of a joke, but become a pretty big part of our culture. It's a great set of rules.
I came to quote this very article. This raised my eyebrows a lot when I originally read it. I always thought that DEVELOPING A DAMN PROGRAMMING LANGUAGE is inherently apolitical and strongly meritocratic endeavor. Boy, how naive I was...
Ah, yes who more fitting to give a eulogy than Guido, who so bravely spoke up when the woke crazies tried to defenestrate (the unfailingly polite, kind and patient) Tim not even 2 years before his death.
As a greybeard (literally) of the industry, I've reached the age where the people who shaped my younger years, and much of the computing world around me, are slowly being piped to /dev/random.
It's sad to hear, but reflecting on the impact Tim made brings some comfort. Most of us will never know how many people our work helped. Tim could at least see some of that, though even Python's reach can only tell part of the story.
Reading the tributes (https://discuss.python.org/t/in-memoriam-tim-peters-1952-202...), what strikes me is how often people mention his patience and humour alongside his technical brilliance. There's something to aspire to there: doing good work, and taking the time to help others do theirs.
The older I get, the more I appreciate what it takes to leave both kinds of legacy.
Quiet lines of code
Still guide the hands of strangers
His kindness lives on
I discovered this early on in my programming journey and it helped set my philosophical trajectory. Over the years I’ve slowly grokked these items. But it was valuable to have a North Star even before I realized why they were important.
This is a lot of wisdom, which you can tell comes from years of experience. I would like all llms of the world to have this as their base prompt.
More succinctly, you can run this as a module:
Which is stored in `this.s` as the following string:
Gur Mra bs Clguba, ol Gvz Crgref
Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg. Fvzcyr vf orggre guna pbzcyrk. Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq. Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq. Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. Abj vf orggre guna arire. Nygubhtu arire vf bsgra orggre guna evtug abj. Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!
Oh, ROT13!
The PEP explicitly says there are 20 of which only 19 are written down and I can't figure out if that is a joke, a deliberate statement, or both.
And at that moment, shiandow was enlightened. ;)
(https://en.wikipedia.org/wiki/Zen_of_Python has more about the discrepancy.)
Interestingly, today this text reads not only as good advice for coders but also as good instructions for agents. Perhaps time to revisit those and make sure the spirit of these adages is captured there
The only thing I never liked about this is complex is better than complicated. Every once in a while there is a post with an “insight” on how they’re different, but it’s the same word! Naming things is hard, but I wish Tim found another word for one of these.
I have cited this poem countless times over the years--sometimes ironically. I'm sad.
Hard to disagree with any of this. RIP.
> There should be one-- and preferably only one --obvious way to do it.
Oh boy, that didn't age well for Python language did it? It matches with C++ in growing complexity of syntax features. With a couple dozen ways to write the very same algorithm.
To be honest I found this sentence to be beautiful and true for many years after working a lot with php and perl. The mort important word in this sentence is obvious. There are many many many ways to do the same thing but working with python I found that mostly to be true, there is always an obvious, documented way (and not two of three!). Searching for a way to do something in perl, for example, was such a huge difference.
Python has never followed the Zen. The irritating way the language lets you use non-booleans in a boolean context flies right in the face of "explicit is better than implicit".
And typing wasn't explicit for a long time. Now it is kind of best practice, but you can still produce Python without typecheck metadata.
Practicality beats purity!
Except it mostly just leads to suprising bugs and time wasting, in exchange for saving a small amount of typing
Thank you, Tim Peters.
.
Among his various other works, it was Tim Peters along with Gary Robinson who turned pg's "A Plan for Spam" essay into the successful SpamBayes program: https://www.linuxjournal.com/article/6467 .
(EDIT: Robert Woodhead apparently shares in the credit, too: https://www.ceas.cc/papers-2004/136.pdf https://ceas.cc/papers-2004.html . Apparently Rob Hooft was another implementor? I can't find a good source for that though.)
Hi I'm the aforementioned Gary Robinson. Very sad to hear of Tim's passing. A really nice guy. And he wrote the following code for the SpamBayes project: https://www.linuxjournal.com/files/linuxjournal.com/linuxjou...
The reason that's especially interesting is that I was using an AI to write something that needed that functionality, and it spewed out that same Python code, which I recognized immediately. It was slightly modified with respect to naming and comments because, I assume, it was stored slightly imperfectly in the model's weights.
This concept of making the best use of any available data to infer useful probabilities seems like a crude form of some ideas behind current LLMs, BUT they (Peters, Graham, Robinson and Woodhead) were doing this work 20 years earlier.
Once upon a time I used to read all python-dev posts and bugs.python.org issues, so I got to follow (and get a feeling of knowing) these people I admired working and discussing together. Tim was always a favorite.
Another thing that made me feel close to him was his work on the Python Cookbook 2nd Edition, in which he (and other big names in the community) delightfully talks the reader through intricacies and insights of programming, "We read Knuth so you don't have to".
Watching Tim do his thing was a pleasure. He'd go from long, deep technical dives (that he'd make as approachable as possible) into comic relief and human connection in the fractional wink of an eye.
The brief interactions we had will always be cherished as high points in my Pythonista trajectory.
One favorite of mine was this response: https://www.python.org/doc/humor/#id15. I also like https://www.python.org/doc/humor/#id19 very much.
One of my favorite Tim Peters comp.lang.python posts has always been this one in the discussion of doctest:
https://groups.google.com/g/comp.lang.python/c/DfzH5Nrt05E/m...
> Ack, on my keyboard I rebound the Tab key to something less annoying: it deletes a random DLL from c:\Windows\SYSTEM\. OK, OK, version 0.0.2 caters to stinking tabs. Patch follows.
Don't forget how he signed that post:
> if-tabs-were-called-hemorrhoids-as-god-intended-people-would-see-them-for-the-bloody-mess-they-are-ly y'rs - tim
Tim was one of the people who contributed to my love of the Python language eventually expanding to its entire community.
He was always so willing to foster discussion that nearly every interaction resulted in an improved understanding of some topic and a shared eagerness to try or learn more out something tangential that came up via digression. I never knew how many types of voting systems there were nor how extensively they are researched! He also reached out about a comment [0] I made a few years ago which made me feel less discouraged and more welcome.
Tim's writing style was greatly appreciated by myself and many others. What he had to say was often lengthy, to address reader assumptions or some nuance, but was written with such a jovial tone that it was rarely dull or inaccessible.
RIP Tim
[0]: https://discuss.python.org/t/5778/24
My last exchange with Tim was him saying that he wasn't feeling up to having visitors.
You never know when an email is going to be the Last Email. Don't put off reconnecting with old friends.
Gene Hackman's character in Heist says "I tried to imagine a a fella smarter than myself. Then I tried to think 'What would he do?'"
For me, Tim Peters was that guy. I first met Tim in person at the first PyCon at GWU where I rode an elevator with him and Barry Warsaw. Let me tell you, it was a wild ride. He was a genuinely really nice, smart, kind guy.
RIP my friend.
In the 1990s I was a novice developer, though I considered myself a hotshot because I was better than those around me in college and grad school.
I was an active participant in the comp.lang.python Usenet channel in the late 1990s.
I learned much from reading Tim Peters' posts. To many, including me, he was affectionately referred to as "Uncle Timmy."
One of the things I learned was that I still had much to learn about the art of programming.
Much of the little I know about numerical methods comes from reading his posts. It was fun to read his stories about Kendall Square Research and the (for me) old days of computing.
I remember posting questions about things I didn't understand, which he figured out and explained. [1]
I remember bringing up concepts I thought were specialized and esoteric, only to find that it was actually just my lack of experience. He gently corrected misapprehensions like mine. [2]
He wrote a lot on comp.lang.python. If I recall correctly, at the 7th International Python Conference in Houston, November 1998, there was Festschrift in his honor. He would use <wink> in his messages, and often end with something like "let's-hear-it-for-lambda-in-curly-assignment-stmts-ly y'rs - tim" (that's from the posting where he outlines the Zen of Python). I wondered if they were collected by looking for messages containing an '-ly' only to have Andrew Kuchling remind me about the "From" header. <wink>
Here is Guido van Rossum starting the thread on "In Memoriam: Tim Peters", at https://discuss.python.org/t/in-memoriam-tim-peters-1952-202... .
Here's an interview of him at PyCon 2006, https://www.youtube.com/watch?v=1wAOy88WxmY
[1] In one case, I was parsing a file format where a field was usually three spaces, but was sometimes an integer. I couldn't figure out why one parser was so much faster than the other. The answer was that one tested for three spaces first, and if that failed tested for the int, while the other did the int test first.
Yes, this is something a senior developer knows. I bring it up now to highlight how hotshot-me didn't have that experience, learned that experience, and learned it from someone who was kind about sharing his knowledge.
[2] I was doing bioinformatics back then, and learned about dynamic programming as way to do sequence alignment. I didn't think others knew about the technique, and thought I was bringing esoteric new information to the discussion. Uncle Timmy had used dynamic programming techniques for speech-to-text software at Dragon Systems, and politely pointed out it was more widely known. He also implemented Python's 'difflib'.
Among other places, Tim also wrote a lot on StackOverflow. He’d answer all kinds of questions, both from novices and experts.[0][1]
I like reading his answers. He always seemed to have something interesting to say, and his answers are kind, light-hearted, approachable and insightful.
[0] https://stackoverflow.com/a/69859068
[1] https://stackoverflow.com/a/19391867
Tim's Blog https://tim-one.github.io/psf/
"Question everything. Love everyone" (from his page)
RIP "Uncle Timmy".
Tim's description of dicts always stuck with me by describing the hash table slot states as one of citizen, virgin, or turd[1]. <wink>
1: https://mail.python.org/pipermail/python-list/2000-March/048...
Yesterday, out of nowhere I remembered Zen of Python and looked it up to refresh my memory. Prior to that I hadn't known who the author was, so when I saw Tim Peter's name I had a moment of realization that it's the same person who invented Timsort and the same person who was banned from python forums a few years ago for opposing arguing agains bylaw changes.
It feels surreal to learn about his death just the next day. RIP
The Tim of Tim Sort, for those that want to identify him quickly.
That was one of the things Oracle sued Google over in that big Android/Java suit right?
Before I clicked into the link I mentally thought "Wait I hope it's not the guy who invented Tim Sort". Very sad. Trying to retain hope that newer generations of Python folks will keep the zen of Python alive but especially in an agentic era, to some degree that hope does feel less and less realistic by the day.
It's the Tim of the Zen of Python for me
Thanks, Tim. Your contributions have helped me feed me family over the years. RIP
(I've taught the Zen of Python, doctests, timsort, and more during my career.)
https://news.ycombinator.com/item?id=50450488 links to GvR's announcment on discuss.python.org .
I have the Zen of python printed out on our office wall and everyone quotes it at least weekly. It started as a bit of a joke, but become a pretty big part of our culture. It's a great set of rules.
I learned how to be a person on the internet in large part by watching Tim back in the day. RIP.
Tim (of Timsort) was a long time python contributor (aka 90s), and a foundation of its early community (>>> import this). Rip.
The world is a bit dimmer for your absence. We miss you.
As a programmer who used Python, I'm in debt to him.
Nice obituary, would have been cool if Guido had stood up for him when he was witch hunted by Python leadership...
https://chrismcdonough.substack.com/p/the-shameful-defenestr...
And after that three months suspension BS drama Tim just got back to work on Python. Saintly.
btw. made me stop having a favourite programming language.
I came to quote this very article. This raised my eyebrows a lot when I originally read it. I always thought that DEVELOPING A DAMN PROGRAMMING LANGUAGE is inherently apolitical and strongly meritocratic endeavor. Boy, how naive I was...
Ah, yes who more fitting to give a eulogy than Guido, who so bravely spoke up when the woke crazies tried to defenestrate (the unfailingly polite, kind and patient) Tim not even 2 years before his death.
I learned about Timsort and used it in a class as a student long ago. RIP.
I quoted im earlier today in a commit message at work. Not knowing him at all, this news is a bit of a shock.
May he rest in peace, I just learned about Timsort!
RIP. I didn't know him IRL, but I remember him fondly from the Python Usenet group and Python bug tracker discussions.
https://en.wikipedia.org/wiki/Tim_Peters_(software_engineer)
https://en.wikipedia.org/wiki/Timsort
If someone has a great photo of Tim they'd be willing to license to Wikimedia for his page, it would be appreciated.
https://commons.wikimedia.org/wiki/Commons:Email_templates#E...
May his memory be a blessing
Very, very sad news. RIP Tim Peters.
Black bar, anyone?
Sounds like he was living quietly out of the spotlight, or his family kept news of his death private. He died back in July.
Agreed. As it was for Fredrik Lundh (aka "the effbot") a few years ago.
RIP.
As a greybeard (literally) of the industry, I've reached the age where the people who shaped my younger years, and much of the computing world around me, are slowly being piped to /dev/random.
It's sad to hear, but reflecting on the impact Tim made brings some comfort. Most of us will never know how many people our work helped. Tim could at least see some of that, though even Python's reach can only tell part of the story.
Reading the tributes (https://discuss.python.org/t/in-memoriam-tim-peters-1952-202...), what strikes me is how often people mention his patience and humour alongside his technical brilliance. There's something to aspire to there: doing good work, and taking the time to help others do theirs.
The older I get, the more I appreciate what it takes to leave both kinds of legacy.
Quiet lines of code Still guide the hands of strangers His kindness lives on
Rest well, Tim.
I posted my thoughts in a parallel thread, at https://news.ycombinator.com/item?id=50451689 .
I focus on how I learned to be a better software developer from him, in both writing better code and supporting others.
(We've since merged that thread hither.)
A black bar is appropriate for this news.