On Mar 21, 2011, at 9:30 PM, Jasper St. Pierre wrote:
> On IRC, exarkun, glyph, spiv and idnar encouraged me to do a bit of
> work on the Defer documentation.
Yay! This documentation could definitely use some work.
> I kept get confused between the things like returning a Deferred from a
> callback and chainDeferred, which I found out wasn't that useful:
Yeah, chainDeferred is not a great method. Now that Deferreds are
non-recursive, I think it's purely worse than inserting an additional Deferred
as a result from a callback.
> My eventual goal is to reduce the number of documentation about defer
> down to a near-impossible two documents. I'm hoping to merge some of
> the good stuff of the other thousands of documents.
That would be absolutely great.
> Thoughts so far?
While I applaud your intent, these drafts look quite rough. The random
interjections and asides in
<http://magcius.mecheye.net/twisted/DeferHowTo-Fixup.html> seem distracting and
confusing to me. Trying to put myself in the mind of a newcomer, I find myself
asking many questions which are irrelevant to what I'm trying to learn:
What's "async"? Why is it hard? (The original document mentions asynchronous
stuff, but in the context of full english sentences.)
Where are we going shopping? What does shopping have to do with this?
What's gevent? Does this have something to do with Twisted?
What's node.js? This looks like Javascript, what does it have to do with
Twisted, which I thought was in Python?
(Now I've gotten distracted and I'm reading about gevent and node.js rather
than making my Twisted application work and completing the Deferred tutorial.
Epic fail. But, if I were to continue...)
What's "this pattern"? Functions? Don't lots of programs use functions?
How do they use it? Why is it relevant?
Why is Twisted's right hand blue? (Forget about being a beginner: I honestly
don't even get this reference. Googling seems to suggest it has something to
do with symptoms of heart disease and doesn't seem funny or relevant at all.)
Why is the first explanation of what a Deferred is referred to as "technical
mumbo-jumbo"? Is this really complicated? If I am not super good at
programming already, should I not be reading this?
What's an "operation"? Does that mean 'function' or 'method' or some other
special thing? It says "most operations in Twisted return a Deferred"; but
I've called lots of functions in Twisted which returned other objects before
reading this tutorial, or returned None. Were those actually Deferreds?
Why do I "not know where this Deferred has been"? Do Deferreds get dirty or
broken somehow when I add multiple callbacks? Should I avoid that?
The Python examples in the current Deferred Reference are mostly runnable. The
ones that aren't, should be. The documentation should stress that you can run
these examples simply, and encourage the reader to download and experiment with
them, and modify them to see what happens when they do things in a different
order.
Instead, the "fixup" changes the first example to rely on a fake library, which
will raise exceptions if I try to run it, but doesn't actually explain that
'magiclib' isn't real. This isn't a huge problem in and of itself (it is
trying to demonstrate the "wrong" way to do things, after all) but it sets up
the expectation that the rest of the examples are fake, too, and I shouldn't
bother to run them.
I think the original document has plenty of issues, but these changes look like
they've been written for people who already mostly understand Deferreds, but
are having trouble catching some of the nuances, and need humor to diffuse
their frustration and more examples to illustrate different usage patterns,
rather than a fundamentally clearer or better explanation than what was offered
before. That makes sense, since based on what you've said on #twisted, that's
basically the position you find yourself in :). This document is supposed to
be a tutorial though, explaining how to use Deferreds to users who really have
no idea what they are (despite its unfortunate name, "Deferred Reference" -
that should probably be changed).
One thing I think is very good about this attempted rework, though, is the
explanation of the motivation for having Deferreds at all, before explaining
how they work. In the current documentation, it's very unclear why we have
such an object in the first place, or what the alternatives to it are.
However, the example presented makes it seem as though you really don't need
Deferreds, because the only problem with the single-callback approach is
handling errors. Another major motivation is the ability to return a Deferred
through a system with several layers, changing the return value at each layer
by post-processing it a bit. (One possible example: a REST API that wants to
deal with objects, and goes via a translation of [bytes from HTTP]->[JSON
dicts/lists from parsing those bytes]->[domain-specific objects by converting
JSON objects according to the particular API's spec].)
However, I think the need would be better illustrated with examples that can
actually be run than with fake examples where we assume that the user knows how
something like gevent works. (Also: gevent doesn't actually work this way, for
fetching web pages at least, so your example is wrong. See
<http://www.gevent.org/intro.html#monkey-patching>.)
It's pretty easy to write a fake implementation of 'fetchWebPageAsync' which
squirrels away the callback somewhere that the example can call it later, and
explain that with some handwaving where we say "and pretend that was actually
some networking code fetching it". For that matter, the reactor is introduced
too early in the existing docs; we should demonstrate calling the callback
synchronously, and then only later introduce a callLater.
Anyway I hope this wall of text did not discourage you - I just think you need
some clearer goals for improving specific aspects of the documentation, and you
should write those down first before trying to actually address them with more
docs.
Thanks for your time,
-glyph
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python