Top
Best
New

Posted by ayhanfuat 1 day ago

Tim Peters has died(discuss.python.org)
https://www.reddit.com/r/Python/s/2Cm5dBcvQw
1276 points | 143 comments
w-m 1 day ago|

  $ 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!
Buttons840 16 hours ago||
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!

darkwater 15 hours ago|||
Oh, ROT13!
FergusArgyll 9 hours ago||||
https://github.com/python/cpython/blob/main/Lib/this.py
anhner 3 hours ago|||
...but why? Why is it encrypted and not stored as plaintext?
notpushkin 1 hour ago||
Wouldn’t be much of an easter egg if it was too easy to understand <wink>?
Waterluvian 18 hours ago|||
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.
tclancy 13 hours ago||
Oh same, same. They didn’t all land at once but I remember multiple times I ran import this because I was bored or finished at the end of a day and thinking, “Oh yeah, I figured that out since the last time.” To me, it was a formative document and I can’t say enough good things about it.
vasco 6 hours ago||
> Oh yeah, I figured that out since the last time.

It's incredible how every single thought you think it's yours was already had a bunch of times.

shiandow 17 hours ago|||
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.
leoc 17 hours ago||
And at that moment, shiandow was enlightened. ;)

(https://en.wikipedia.org/wiki/Zen_of_Python has more about the discrepancy.)

rbanffy 13 hours ago||
Two of the most common bugs in programming is the off-by-one error.
bitter_michael 17 hours ago|||
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
gavmor 18 hours ago|||
I have cited this poem countless times over the years--sometimes ironically. I'm sad.
js2 15 hours ago|||
More succinctly, you can run this as a module:

  $ python -m this  # -mthis works too
driggs 5 hours ago|||
You've missed the joke, or maybe you weren't old enough to be learning Python during Java's heyday.

The joke is that people wanting to write Python like Java - with an implicit reference to an object's instance - would attempt to import Java's `this` keyword.

Instead of getting Java-like behavior, they're presented with the Zen of Python. You wouldn't be wrong to think that it was as much a commentary on other popular languages of the day as it was a guiding ethos of Python itself.

"Beautiful is better than ugly. Explicit is better than implicit."

wk_end 4 hours ago||
c.f. what happens when you try `from __future__ import braces`
nine_k 8 hours ago|||
The call to import this has more than the Python syntax meaning.
davidja 14 hours ago|||
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.
pwdisswordfishq 5 hours ago||
https://www.youtube.com/watch?v=anyhBdt79Cs

Pretty much all of this critique applies squarely to the Zen of Python.

moron4hire 2 hours ago||
Seriously. None of those lines are actionable in any way. It seems to ruin afoul of its own advice, "If the implementation is hard to explain, it's a bad idea."
ycombinatrix 37 minutes ago|||
For some reason, this describes Rust to me way better than it describes Python.
coffeemug 15 hours ago|||
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.
kstrauser 13 hours ago|||
A complication on a wristwatch is anything other than telling time. Phases of the moon? Tides? Calendars? Complications. They make the innards more complex and fragile and difficult to build and repair. Complexity is the inherent difficulty in building the thing.

Together, what that's saying is that sometimes the minimal baseline complexity is going to be pretty high. If you're making a library to support all of HTTP/2, it's going to have lots of codepaths, and that's unavoidable. It's a complex problem requiring a complex solution. But consider SMTP, the "simple" mail transfer protocol. The protocol itself is stupidly simple. I can use — and have used — telnet to port 25 to send email. But because the protocol is so simple, implementing it is extremely complicated. Were the protocol a little more complex, the implementations could be vastly simpler.

Or perhaps more simply, if you're writing a textual protocol, define it as using UTF-8 encoding and move on. UTF-8 is more complex than simpler encodings like ASCII. Allowing your clients and servers to decide that they'd rather support something goofy, like Shift JIS or UTF-16, just makes everything vastly more complicated. Accept that the complexity of UTF-8 is inherent and sufficient, pay the cost, and then let all of your consumers be much simpler.

tacitusarc 12 hours ago||
See also, Constraints Liberate and Liberties Constrain
schrodinger 6 hours ago||||
Complex = a problem that's inherently difficult to solve due to its fundamental nature. Time is a great example.

Complicated = a solution that's difficult to understand due to a convoluted implementation. These can be simplified.

In other words, the difference is whether the difficulty is inherent to the problem space (complex) versus inflicted by a solution (complicated).

collingreen 14 hours ago||||
I'll take a stab in this context:

Complex - many parts (but the parts could potentially be simple) Complicated - have to understand many things in order to understand it at all; large surface area

noufalibrahim 6 hours ago||||
It's generally a tradition for wise adages to be a little ambiguous leaving interpretation to the reader. I think that's as much a feature as it's a bug. Perhaps he meant it that way.
jacobolus 8 hours ago||||
The two words are both centuries old, so have had many chances for various authors and fields to adopt them for differing purposes, sometimes in contradictory ways. So for example a "complex system" (in the sense of the Santa Fe Institute) means something moderately different than what Tim Peters means. In plain English, they are broadly synonymous, so if you were writing a newspaper story you shouldn't expect readers to find subtle differences between them.

But if you know somewhat what implication a particular writer intends in drawing a distinction between the two words, then there's no inherent problem. "Simple is better than complex. Complex is better than complicated." is a pithy way to express a valuable idea:

We should try to make our interfaces, data structures, implementations, systems, etc. "simple", that is, dealing with just one thing at a time, in a clear and straightforward way, with few components each with a well defined purpose, etc. Sometimes, however, there is inherent difficulty in a problem or in the world requiring many interacting pieces, but we should still aim to avoid making things "complicated", that is, tangled, messy, difficult to reason about, ambiguous, unpredictable, gratuitously mixing unrelated concerns, etc.

MForster 5 hours ago||||
to complicate = to make more complex

If something is complex, you have to deal with it. But to complicate things is to be avoided.

caned 12 hours ago||||
Simple and complex are two sides of the same coin. Both are everywhere in nature. Complication is something else, but how can you describe it? I can think of examples. Bureaucracy comes to mind. Locking and synchronization primitives too. The kind of fragile mechanisms in the Linux kernel that lead to endless CVEs are another. All man-made things!
mmooss 13 hours ago|||
> it’s the same word!

I guess if you take the square root of -1 you do get a complicated number, but it's a complex one. And then there's the complication for modern democracy called the military-industrial complex, and Oedipus's complex certainly complicated things. Then there's Ghost in the Shell: Standalone Complex, but I'm not really sure what that means.

Seriously, here's the best summary I can quickly find: [0]

"Complicated problems can be hard to solve, but they are addressable with rules and recipes, like the algorithms that place ads on your Twitter feed. They also can be resolved with systems and processes, like the hierarchical structure that most companies use to command and control employees.

... Complex problems involve too many unknowns and too many interrelated factors to reduce to rules and processes. A technological disruption like blockchain is a complex problem. A competitor with an innovative business model — an Uber or an Airbnb — is a complex problem. There’s no algorithm that will tell you how to respond.

This could be dismissed as an exercise in semantics, except for one thing: When facing a problem, says Nason, managers tend to automatically default to complicated thinking. Instead, they should be “consciously managing complexity.”"

Those are very different problems for software development too, and many in IT definitely try to treat every problem as complicated.

[0] https://sloanreview.mit.edu/article/the-critical-difference-...

flykespice 17 hours ago|||
> 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.

buster 16 hours ago|||
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.
jacquesm 1 hour ago||||
Let's start off with 'Which Python?'
bazoom42 2 hours ago||||
There will always be a billion way to write the same algorithm in a Turing-complete language. That is not the point.
throwaway5752 14 hours ago||||
It is really more aspiration, and a good programmer mantra anywhere. Nothing here is so Python specific outside namespaces, and ... that is also a good programmer mantra.
bigstrat2003 16 hours ago|||
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".
zestyping 12 hours ago|||
This will probably sound crazy to some of you, but I believe the introduction of the boolean type was a mistake.

Every primitive type has a null value, and the "if" statement tests for such a value. Whether a value is true or false is a property of the value. Notice that "true" and "false" are adjectives, not nouns.

That is a simple, internally consistent model with one concept of trueness.

The introduction of the boolean type made this a lot messier: it makes "if" look like type coercion, and introduces two different ways to think of boolean-ness (as an adjective or as a noun) which you must hold in your head at the same time. For example, it became possible to compare things as equal to True or False, doubling the number of ways to express a condition: "if x" and "if x == True" are now very similar, but subtly different, ways to express the same thing. The fact that we have to talk about things as "truthy" or "falsy" as if these were different from "true" and "false" is a further illustration of the mess this has created.

If we had stuck with 0 and 1, we would have avoided all this confusion. It is imperfect but simple; what we ended up with is still imperfect and needlessly complicated.

driggs 5 hours ago|||
I still have a printed stack of Python 1.5.7 docs from when I first learned the language.

The addition of boolean `True` and `False` were a huge improvement to the language when they were finally added in 2.3.

I'm not sure why you're making things more complicated than they need to be. Test for truthiness. Conditional statements already evaluate boolean expressions, you're not adding anything explicit by writing `== True`.

tacitusarc 12 hours ago|||
Booleans are reductionist and likely harmful, as they allow programmers to avoid thinking in terms of the test they are actually performing: is this a member of some set? If the problem is reworked like that Booleans are superfluous (this representation could be compiled to something as performant as using Booleans).

I am not sure if that perspective aligns with yours.

zephen 6 hours ago||
Not sure why you're getting downvoted so much, but to put this thought into a somewhat broader context:

In an explicitly, statically typed language, bools might be useful as a standard small enum.

In what Python used to be, they weren't, not really.

But for whatever reason, declared typing is now an add-on to the language, and the people who like the verbosity of declared typing also, perhaps schizophrenically, like the terseness afforded by having a standard small enum.

loeg 16 hours ago||||
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.
michaeldh 16 hours ago||||
Practicality beats purity!
logophobia 15 hours ago||
Except it mostly just leads to suprising bugs and time wasting, in exchange for saving a small amount of typing
benji-york 12 hours ago|||
Do you know why it is the way it is?
bossyTeacher 12 hours ago|||
I took this mantra with me when I learned other languages.
glerk 17 hours ago|||
Hard to disagree with any of this. RIP.
userbinator 6 hours ago||
It's hard to disagree, since it's very vague and subjective.
svilen_dobrev 18 hours ago|||
Thank you, Tim Peters.

.

sillysaurusrex 17 hours ago||
[dead]
leoc 19 hours ago||
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.)

garyrob 15 hours ago||
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.

curiousObject 17 hours ago|||
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.
nly 3 hours ago||
Bayes theorem dates back 250 years.

This is what engineering is all about. Applying what it long known to solve new problems, or old problems better.

LLMs are a triumph today because someone made a keystone observation

jeremyjh 11 hours ago||
I loved SpamBayes! It’s amazing how effective that was, all those years ago. I never learned Python, but I never had trouble using it to build small useful scripts. I never knew I had Tim to thank for both.
lumpa 1 day ago||
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.

pdonis 18 hours ago|
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...

apetresc 18 hours ago||
> 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.
pdonis 15 hours ago||
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

dalke 1 day ago||
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'.

ofek 17 hours ago||
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

lukasgelbmann 16 hours ago||
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

zahlman 13 hours ago||
I had largely moved on from Usenet and mailing lists by the mid 00s when I started using Python in earnest, so I was largely unaware of the people involved even if I would have recognized the names. Tim's participation in Stack Overflow gave me (at least as best I can recall) my first real exposure to him as a person, and resulted in a cherished memory and one of what I like to cite as the feathers in my cap: https://stackoverflow.com/questions/21297887 .
bjourne 10 hours ago||
He wrote a very detailed answer to a question I had years ago: https://stackoverflow.com/questions/61758735/find-longest-ad...

At the time I didn't realize it was the Tim Peters. Very helpful guy. RIP

linsomniac 22 hours ago||
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.

linsomniac 18 hours ago||
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.

zahlman 13 hours ago|
Oof, that hits hard. You got me to check; apparently it's been over a year and a half in my case. On the plus side, it involved praising him for his work on faster-than-quadratic int<->str conversion (https://github.com/python/cpython/issues/90716) (which seems to be related to the introduction of Karatsuba multiplication, and to the existence of _pydecimal, although I only really grasped the details in the moment) and getting excited about my then-upcoming blog redesign. Good memories.
bonoboTP 18 hours ago||
Nice obituary, would have been cool if Guido had stood up for him when he was witch hunted by Python leadership...
polotics 18 hours ago||
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.

corroclaro 14 hours ago|||
I sometimes wonder if people-who-think-of-solving-problems-not-creating-them-defensively should secede from the rest of the Internet.

They can keep the tools & remix new ones with LLMs. The rest of us can hang out in some tiny corner talking civilly.

hn_throwaway_99 6 hours ago||
Post-George Floyd up until Donald Trump was elected, which is when this happened, was peak of this performative bullshit. Like renaming master to main or changing the the name of blacklists and whitelists would end racism, when all this language policing did was make people quietly resentful and was one factor in the backlash that followed.
Postosuchus 15 hours ago|||
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...
mmooss 12 hours ago||
We are naive when we think, as we all do at times, that humans in our <group> differ from the others - that we have no politics or biases and aren't affected by those things, and we form some just, meritocratic ideal.

When we find ourselvees thinking that, then we are part of the status quo - the system is designed to suit us. It's very easy to think that status quo is the entire universe; just keep doing what you're doing. Instead, to avoid perpetuating the bad aspects of the system, it's essential to curiously and closely look for its boundaries, look outside it, notice the humans out there who are not being served, who may express unhappiness.

Take them at their word; they may seem absurd, but that's your human response to someone violating norms - the norms being the status quo. Their expression may include being disruptive or unpleasant. 'Disrupt' means 'violate the status quo'; it shows you the status quo's limitations.

bonoboTP 9 hours ago||
No, it's just entryism. It's not inevitable. Long march. I was naive once, too.
zaphirplane 3 hours ago|||
That isn’t a fair statement to make
bonoboTP 1 hour ago||
How so? Did he stand up for him?
blast 6 hours ago|||
How cowardly that he doesn't even mention that here.
staz 3 hours ago||
You people seems to care a lot more than about this event that Tim Peters ever did.

It looks like you (plural) bring it up only to push your political agenda against Woke or whatever.. while people are mourning and I find it frankly distasteful and an insult to his memory.

bonoboTP 1 hour ago||
Doesn't take a lot of care to post a one sentence comment. But I get it, it would be preferable to "you people" (to point your phrase back at you) to memory-hole those times.
cauch 7 minutes ago||
I don't know.

This whole episode certainly reflects very badly on PSF SC. But it is not a very glorious event of Peters' life either, and it feels better to just not uselessly stir the pot in a way that makes Peters not look good.

(and again, to be clear, PSF SC looks even worse, but of course the point is to remember Peters for what he was, not to profit of his passing to score points against PSF SC)

philipallstar 4 hours ago|
This is a good time to remind everyone of the shabby way the PSF treated Tim Peters, a bunch of lesser minds and nasty people gossip-attacking a great mind and a lovely chap[0].

[0] https://lwn.net/Articles/1002340

More comments...