The trouble is that you can't easily tell just by looking at (f x) how to interpret it.Every serious development group is going to need a few patterns and coding standards, because newsflash: no language is perfect. All languages need to be used properly.
If you have good standards for naming, then a simple search should tell you exactly how to read "(f x)" in less than a second. The same goes for Smalltalk method names. If an extremely important method in your application code gets named "add:" well, guess what, there are already base class methods named "add:"! This means your senders searches and implementor searches -- which are fundamental to the way lots of expert Smalltalkers code -- are going to be polluted.
Also, the same thing can apply to function names in Python!
In dynamic languages, good programmers know names are very important. Before a good, experienced dynamic language programmer names something "foo", they first search for foo! They search for things that might be confused with foo! Programmers of dynamic languages who don't do this are either ignorant or inconsiderate. This post doesn't strike me as written by someone experienced or knowledgeable with development in dynamic languages. (And if he's experienced, he's had the bad luck of having been mentored in short-sighted groups.)
There's a lot of repetition and many times it's downright verbose. But where Lisp is nice to write and hard to read, Python makes the opposite tradeoff. It's easy to read. You can determine how to interpret something—a string, a list, a function call, a definition—just by looking at the code locally.
This post takes no account of Don't Repeat Yourself and is seemingly written with no foreknowledge of this idea. Curious, since Python is powerful enough to get close to the ideal of Don't Repeat Yourself.
Strategy for creating a blog post that looks analytical and sounds good -- but only to sophomore programmers:
1) Pick a certain aspect Y of language X which can be abused
2) Give a detailed analysis for why Y is bad
3) Completely leave out any mention of known best practices for addressing Y
4) Compare to a more popular language Z. Leave out any mention of Y applied to Z.
This way, you can get some attention from sophomore programmers and provide them a way to feel better by giving them a good sounding reason to avoid studying X.
Really, this kind of sophistry is so common, there should be a name for it! (Actually, there is a way that Lisp can be easy to write and hard to read, but that has to do with macro expansion. But the tendency is for those with substantive Lisp experience to know about things like that.)
EDIT: To avoid distracting "ad hominem" nonsense. Note the argument is completely the same.
EDIT: Got read/write mixed up.