<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Review on Random notes from mg</title>
    <link>https://mg.pov.lt/blog/tags/review.html</link>
    <description>Recent content in Review on Random notes from mg</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>marius@gedmin.as (Marius Gedminas)</managingEditor>
    <webMaster>marius@gedmin.as (Marius Gedminas)</webMaster>
    <copyright>Copyright © 2004–2020 Marius Gedminas</copyright>
    <lastBuildDate>Sun, 04 Apr 2010 22:30:12 +0300</lastBuildDate>
    <atom:link href="https://mg.pov.lt/blog/tags/review/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Review: Grok 1.0 Web Development</title>
      <link>https://mg.pov.lt/blog/grok-book-review.html</link>
      <pubDate>Sun, 04 Apr 2010 22:30:12 +0300</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/grok-book-review.html</guid>
      <description>
&lt;p&gt;Disclaimer: I received a free review copy of this book. The book links are
affiliate links; I get a small amount from any purchase you make through them.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://grok.zope.org/&#34;&gt;Grok&lt;/a&gt; is a Python web framework, built on
top of the Zope Toolkit, which is the core of what used to be called Zope 3 and
is now rebranded as BlueBream.  Confused yet?  Get used to it: the small
pluggable components are the heart and soul of ZTK, and the source of its
flexibility. It&#39;s not surprising that people take the same approach on a larger
scale: take Zope 3 apart into smaller packages and reassemble them into
different frameworks such as Grok, BlueBream or repoze.bfg.&lt;/p&gt;

&lt;p style=&#34;float: right; margin: 0 0 1em 1em&#34;&gt;
&lt;a href=&#34;http://www.packtpub.com/grok-1-0-web-development/book/mid/150310wgpfxa?utm_source=mg.pov.lt&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_002715&#34;&gt;
  &lt;img src=&#34;https://mg.pov.lt/grok-book.jpg&#34;
       width=&#34;250&#34; height=&#34;309&#34; alt=&#34;Grok 1.0 Web Development by Carlos de la Guardia&#34; /&gt;
&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The &lt;a
  href=&#34;http://www.packtpub.com/grok-1-0-web-development/book/mid/150310wgpfxa?utm_source=mg.pov.lt&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_002715&#34;&gt;Grok
  book by Carlos de la Guardia&lt;/a&gt; introduces the framework by demonstrating
how to create a small but realistic To-do list manager.  I like this technique,
and it works pretty well.  The author covers many topics:&lt;/p&gt; 
&lt;ul&gt;
  &lt;li&gt; creation of a new project &lt;/li&gt;
  &lt;li&gt; simple views with Zope Page Templates &lt;/li&gt;
  &lt;li&gt; automatic form generation from schemas (with tweaks) &lt;/li&gt;
  &lt;li&gt; catalogs and indexes (my favourite chapter) &lt;/li&gt;
  &lt;li&gt; security: users, roles, permissions; authentication and authorization &lt;/li&gt;
  &lt;li&gt; extremely pluggable page layouts with viewlets and pagelets &lt;/li&gt;
  &lt;li&gt; basic ZODB, blobs, ZEO, database packing, backups with repozo &lt;/li&gt;
  &lt;li&gt; SQL databases, integration with SQLAlchemy (including a common
       transactional model) &lt;/li&gt;
  &lt;li&gt; component architecture: adapters and utilities &lt;/li&gt;
  &lt;li&gt; Martian: extending Grok by defining custom component directives &lt;/li&gt;
  &lt;li&gt; very short intro to testing (zope.testing, unit tests and doctests,
       functional tests with zope.testbrowsing) and debugging (pdb; AJAXy
       debugger, which looks exactly like the Pylons one with an uglier skin) &lt;/li&gt;
  &lt;li&gt; deployment (my second favourite chapter): paster, apache and mod_proxy,
       mod_wsgi, pound, squid, varnish, scalable deployments. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some important topics like internationalization, time zones, testing with
Selenium, and (especially) database migration (which is pretty specific for
ZODB) were not covered.&lt;/p&gt;

&lt;p&gt; &lt;strong&gt;If you want to learn about Grok, this book will be useful&lt;/strong&gt;,
but there&#39;s a caveat: there&#39;s the usual slew of typographical mistakes and
other errors I&#39;ve come to expect from books published by Packt.  It&#39;s their
third book I&#39;ve seen; all three had surprisingly high numbers of errors.  Some
had more, others had fewer.  The Grok book was on the high side and the first
one where I was tempted to record a &#34;&lt;a
  href=&#34;http://www.osnews.com/story/19266/WTFs_m&#34;&gt;WTFs per page&lt;/a&gt;&#34; metric.
The mistakes are easy to notice and correct, so they didn&#39;t impede my
understanding of the book&#39;s content.  Disclaimer: I&#39;ve been working with
Zope 3 for the last six-or-so years, so I was pretty familiar with the
underlying technologies, just not the thin Grok convenience layer. &lt;strong&gt;If
  minor errors annoy you, stay away.&lt;/strong&gt;  I haven&#39;t noticed any major
factual errors, although there were what I would consider some pretty important
omissions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ZODB is not as transparent as people tell you.  There are many gotchas,
  especially if you want to refactor your code without throwing away old
  databases.&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;bin/buildout&lt;/tt&gt; is free to recursively remove anything under
  &lt;tt&gt;parts&lt;/tt&gt;.  Keeping your database there is fine only if you don&#39;t mind
  occasionally starting from scratch.&lt;/li&gt;
  &lt;li&gt;&lt;tt&gt;repozo&lt;/tt&gt; does not back up blobs.&lt;/li&gt;
  &lt;li&gt;The ZODB transaction conflict resolution depends on being able to
  repeat requests several times; this is important if your code has external
  side effects (e.g. sends emails, creates files, pings 3rd party websites over
  HTTP).  Packages like megrok.rdb or zope.sendmail take care of this; it&#39;d be
  nice to be shown how to do that  for your own code before you discover this
  issue the hard way when your app starts charging people&#39;s credit cards three
  times every now and then. &lt;/li&gt;
  &lt;li&gt;You need to make sure you send out object events at appropriate times, or
  your catalog indexes won&#39;t be updated.&lt;/li&gt;
  &lt;li&gt;Permission and role grants are persistent: if you delete a user and then
  create a new one with the same username, the new user will have all the roles
  and permissions granted to the old one.  If you implement user deletion, you
  need to explicitly remove old grants.&lt;/li&gt;
  &lt;li&gt;The Zope security model expects every object to have a valid &lt;code&gt;__parent__&lt;/code&gt;
  attribute; permission/role grants will not work properly on objects without a
  &lt;code&gt;__parent__&lt;/code&gt;.  Most of the time this is taken care of
  automatically, but when it&#39;s not, you can get really confusing errors.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;applySkin&lt;/code&gt; should only be used for browser requests; blindly
  calling it from a traversal event handler can break WebDAV/XML-RPC.
  (Incidentally, I should file a bug about that; it should abort if you pass a
  non-browser request instead of silently converting it into a browser
  request.)&lt;/li&gt;
  &lt;li&gt;Allowing end-users to specify &lt;code&gt;++skin++&lt;/code&gt; in the URL can be a
  security hole.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, Grok is pretty nice, especially compared to vanilla Zope 3.
However, when compared to frameworks like Pylons or Django, Grok appears more
complex and seemingly requires you to do additional work for unclear gain.  For
example, chapter 8 has you writing three components for every new form you add:
one for the form itself, one for a pagelet wrapping the form, and one for a
page containing the pagelet.  Most of that code is very similar with only the
names being different.  I&#39;m sure there are situations where this kind of
extreme componentization pays off (e.g. it lets you override particular bits on
particular pages to satisfy a particular client&#39;s requests, without affecting
any other clients), but the book doesn&#39;t convincingly demonstrate those
advantages.  Again, I may be biased here since I&#39;ve been enjoying those
advantages for the past six years, without ever having felt the pain of doing
similar customizations with a less flexible framework.  (It&#39;s a gap in my
professional experience that I&#39;m itching to fill.) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a
  href=&#34;http://lateral.netmanagers.com.ar/weblog/posts/BB885.html&#34;&gt;some&lt;/a&gt; &lt;a
  href=&#34;http://blog.pythonisito.com/2010/03/review-grok-10-web-development.html&#34;&gt;other&lt;/a&gt;
&lt;a
  href=&#34;http://www.jmcneil.net/2010/03/review-grok-1-0-web-development/&#34;&gt;reviews&lt;/a&gt;
on Planet Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; &lt;a
  href=&#34;http://blog.lowkster.com/2010/04/review-of-grok-web-development-10-part.html&#34;&gt;Another
  review&lt;/a&gt; (well, part 1 of one, but I got tired waiting for part 2).
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Review: Python Testing: Beginner&#39;s Guide</title>
      <link>https://mg.pov.lt/blog/python-testing-review.html</link>
      <pubDate>Sat, 13 Mar 2010 21:54:48 +0200</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/python-testing-review.html</guid>
      <description>
&lt;p&gt;I&#39;ve been testing (as well as writing) Python code for the last eight years,
so a book with the words &lt;em&gt;Begginer&#39;s Guide&lt;/em&gt; prominently displayed on
the cover isn&#39;t something I&#39;d&#39;ve decided to buy for myself.  Nevertheless
I jumped at the offer of receiving a free e-copy for reviewing it.&lt;/p&gt;

&lt;p style=&#34;float: right; margin: 0 0 1em 1em&#34;&gt;
&lt;a href=&#34;http://www.packtpub.com/python-testing-beginners-guide/book/mid/1503107sqs3w?utm_source=mg.pov.lt&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_002714&#34;&gt;
  &lt;img src=&#34;https://mg.pov.lt/python-testing.jpg&#34;
       width=&#34;250&#34; height=&#34;309&#34; alt=&#34;Python Testing: Beginner&#39;s Guide by Danien Arbuckle&#34; /&gt;
&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short summary:&lt;/strong&gt; it&#39;s good book.  I learned a thing or two
from it.  I don&#39;t know well it would work as an introductionary text for
someone new to unit testing (or Python).  Some of the bits seemed
overcomplicated and underexplained, parts of the example code/tests seemed to
contain design decisions received from mysterious sources.&lt;/p&gt;

&lt;p&gt;Incidentally, &lt;a href=&#34;http://www.packtpub.com/&#34;&gt;Packt&lt;/a&gt; uses a simple yet
effective method for watermarking e-books: my name and street address are
displayed in the footer of every page.  What&#39;s funny is that the two non-ASCII
characters in the street name are replaced with question marks.  It&#39;s not a
data entry problem: the website that let me download those books shows my
address correctly, so it must be happening somewhere in the PDF production
process.  I didn&#39;t expect this kind of Unicode buggyness from a publisher.
Then again there were occasional strange little typographical errors in the
text, like not leaving a space in front of an opening parenthesis in an English
sentence, or using a never-seen-before &lt;tt&gt;+q=&lt;/tt&gt; operator in Python code.  I
was also left wondering how the following sentence (page 225) could slip past
the editing process:&lt;/p&gt;

&lt;blockquote&gt;
  doctest ignores everything between the &lt;tt&gt;Traceback (most recent last call)&lt;/tt&gt;.
&lt;/blockquote&gt;

&lt;p&gt;Thankfully those small mistakes did not detract from the overall message of
the book.&lt;/p&gt;

&lt;p&gt;I liked the author&#39;s technique of showing subtly incorrect code, letting the
reader look at it and miss all the bugs, and then showing how unit or
integration tests catch the bugs the reader missed.  I&#39;m pretty sure there&#39;s at
least one remaining bug that the author missed in the example package (storing
a schedule doesn&#39;t erase old data), which could serve for a new chapter on
regression testing if there&#39;s a second edition.&lt;/p&gt;

&lt;p&gt;Summary of topics covered:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Terms: unit testing, integration testing, system testing.&lt;/li&gt;
  &lt;li&gt;Basics of doctest and unittest, their strengths and weaknesses.&lt;/li&gt;
  &lt;li&gt;Using mocks (with Mocker).&lt;/li&gt;
  &lt;li&gt;Using Nose.&lt;/li&gt;
  &lt;li&gt;Test-Driven Development with lots of example code.&lt;/li&gt;
  &lt;li&gt;Using Twill.&lt;/li&gt;
  &lt;li&gt;Integration testing with lots of example code.&lt;/li&gt;
  &lt;li&gt;Using coverage&lt;/li&gt;
  &lt;li&gt;Post-commit hooks to run tests with Bazaar, Mercurial, Git, Darcs,
      Subversion.&lt;/li&gt;
  &lt;li&gt;Continuous integration with Buildbot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found the TDD cycle a bit larger than I generally like, but I believe it&#39;s
a matter of taste, and perhaps a shorter cycle wouldn&#39;t work as well in a
written medium.&lt;/p&gt;

&lt;p&gt;I found it a bit jarring how the Twill chapter intrudes between the two
chapters showing unit testing and integration testing of the same sample
package.  I think it would&#39;ve been better to swap the order of chapters 8 and
9.&lt;/p&gt;

&lt;p&gt;I liked the technique presented for picking subsets of the code for
integration tests, although I wonder how well it would work on a larger
project.&lt;/p&gt;

&lt;p&gt;Topics not covered:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Functional testing (which is very close but not exactly the same as
      system testing).&lt;/li&gt;
  &lt;li&gt;Regression testing (page 46 contains advice about this without mentioning
      the term &lt;em&gt;regression testing&lt;/em&gt;).&lt;/li&gt;
  &lt;li&gt;Continuous integration with Hudson (simpler to set up than buildbot,
      easily covers 80% of cases).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see these holes are all rather small.&lt;/p&gt;

&lt;p&gt;Probably the biggest weakness of the book is the complexity of some
things shown:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt; writing mocks for pure unit tests &lt;/li&gt;
  &lt;li&gt; mocking other instances of the same class under test &lt;/li&gt;
  &lt;li&gt; even occasionally mocking &lt;em&gt;self&lt;/em&gt;, which needs tricks like
       calling a method&#39;s &lt;tt&gt;im_func&lt;/tt&gt; directly &lt;/li&gt;
  &lt;li&gt; mocking &lt;tt&gt;__reduce_ex__&lt;/tt&gt; so you can pickle mocks in an
       &lt;em&gt;integration test&lt;/em&gt;, instead of using real classes or simple
       stubs. &lt;/li&gt;
  &lt;li&gt; testing the same code multiple times: unit tests, several sets of
       integration tests that test ever-increasing subsets of classes &lt;/li&gt;
  &lt;li&gt; &lt;a href=&#34;http://buildbot.net/&#34;&gt;Buildbot&lt;/a&gt; instead of
       &lt;a href=&#34;http://hudson-ci.org/&#34;&gt;Hudson&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Seeing the repetitive and redundant mock code in the first few doctest
examples I started asking &lt;em&gt;what&#39;s the point?&lt;/em&gt;, but the book failed to
provide a compelling answer (the answer provided&amp;mdash;it&#39;s easier to locate
bugs&amp;mdash;works just as well for integration tests that focus on individual
classes).  And there are good answers for that question, like instant feedback
from your unit test suite.  Are they worth the additional development effort?
Maybe that depends on the developer.  I don&#39;t think they would help me, so I
tend to stick with low-level integration tests I call &#34;unit tests&#34; (as well as
system tests; it&#39;s always a mistake to keep all your tests in a single level).
I&#39;m slightly worried that this book might give the wrong impression (testing is
hard) and turn away beginning Python programmers from writing tests
altogether.&lt;/p&gt;

&lt;p&gt;Overall I do not feel that I have wasted my time reading &lt;a
&lt;a href=&#34;http://www.packtpub.com/python-testing-beginners-guide/book/mid/1503107sqs3w?utm_source=mg.pov.lt&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_002714&#34;&gt;Python
  Testing&lt;/a&gt;.  I look forward to reading &lt;a
  href=&#34;http://python.genedrift.org/2010/03/03/python-testing-beginner’s-guide-review/&#34;&gt;the&lt;/a&gt;
&lt;a
  href=&#34;http://www.blog.pythonlibrary.org/2010/03/06/book-review-python-testing/&#34;&gt;other&lt;/a&gt;
&lt;a
  href=&#34;http://mcjeff.blogspot.com/2010/03/review-python-testing-beginners-guide.html&#34;&gt;reviews&lt;/a&gt;
that showed up on Planet Python.  I gathered that not all reviewers were happy
with the book, but avoided reading their reviews in order not to influence my
own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I especially liked &lt;a
  href=&#34;http://www.protocolostomy.com/2010/03/18/python-testing-beginners-guide-the-review/&#34;&gt;this
  review by Brian Jones&lt;/a&gt;.  The lack of awkward page breaks in code examples
is something that I only noticed after reading a different book, which is full
of such awkward breaks, &lt;em&gt;sigh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; The book links are now affiliate links; I get a small
amount from any purchase you make through them. &lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Expert Python Programming</title>
      <link>https://mg.pov.lt/blog/expert-python-programming.html</link>
      <pubDate>Fri, 08 May 2009 06:09:07 +0300</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/expert-python-programming.html</guid>
      <description>
&lt;p&gt;It&#39;s been a while since the last &lt;a
  href=&#34;http://www.packtpub.com/expert-python-programming/book&#34;&gt;Expert Python
  Programming&lt;/a&gt; review on &lt;a href=&#34;http://planet.python.org&#34;&gt;Planet
  Python&lt;/a&gt;.  Y&#39;all might&#39;ve forgotten about this book by now.  Time for a
reminder?  (Actually, I&#39;m just &lt;span style=&#34;text-decoration:
  line-through&#34;&gt;lazy&lt;/span&gt; busy, and this is why this review hasn&#39;t appeared
sooner.)&lt;/p&gt;

&lt;p&gt;I received a free PDF copy of this book from Packt Publishing, with the
understanding that I&#39;ll post a review on my blog.  This is it.  Short summary:
it is a good book marred by a lot of mostly inconsequential little mistakes.
I&#39;d give it four stars out of five.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Aside: the PDF that I could download was personalized and had my
  name and address in the footer of every page.  A very nice form of DRM that
  did not restrict my software choices for reading the book (Evince and also
  PDF Reader on Nokia Internet Tablets).&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;I bring it up here because it seems that Packt could&#39;ve also applied fixes
  for &lt;a
    href=&#34;http://www.packtpub.com/view_errata/book/expert-python-programming&#34;&gt;the
    known errata&lt;/a&gt; to the personalized version, yet missed that opportunity.
  Perhaps it&#39;s technically more difficult than slapping a footer on every page.
  Or maybe it&#39;s better if everyone buying the book, whether in paper or in
  PDF, gets to see the same text.&lt;/small&gt;&lt;/p&gt; 

&lt;p&gt;The author (Tarek Ziade) covers a wide range of topics in the book, ranging
from syntax (probably useful for those who&#39;ve been programming in Python for
quite a few years, and didn&#39;t have the time to keep up with the language
changes before picking up this book) to style, source code organization,
project infrastructure, software life cycle, documentation, testing and
optimization, and finally ending with a review of some of the popular design
patterns.  The middle parts were the most interesting for me personally.  I
learned a thing or two, disagreed with the author on a few minor points (which
are mostly a matter of preference), and managed to finish the book despite
constant irritating little pricks I feel when I notice an error (I confess I&#39;m
a pedant.  A missing space after a colon drives me up the wall).&lt;/p&gt;

&lt;p&gt;As an example of the disagreement: I have an aversion to code-generating
tools where you have to edit the generated code by hand.  I could say more, but
this is a topic for another time.  Next, I strongly dislike &lt;tt&gt;sudo
  easy_install&lt;/tt&gt; since it scribbles onto the part of the filesystem
exclusively reserved for your OS&#39;s package management tools.  And I don&#39;t think
porting the original 23 design patterns to other programming languages is a
good way to describe what those languages are about.  (Also, &lt;tt&gt;set
  tabstop=4&lt;/tt&gt; in your .vimrc?  Heresy!  The Right Thing To Do is
 &lt;tt&gt;set &lt;em&gt;soft&lt;/em&gt;tabstop=4&lt;/tt&gt;, as all right-thinking Vim users will
 doubtlessly agree.  All hail the one true text editor! &lt;small&gt;Oh dear, now I&#39;m
   glad I don&#39;t have comments on this blog...&lt;/small&gt;)&lt;/p&gt;

&lt;p&gt;The goodies: Chapter 1 (the bits about &lt;a
  href=&#34;http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP&#34;&gt;PYTHONSTARTUP&lt;/a&gt;
on page 19) gave me persistent history for my interactive Python prompt, nicely
complementing the coloured prompt and tab-completion I already had snarfed from
somewhere else on the net (probably Peter Norvig&#39;s &lt;a
  href=&#34;http://norvig.com/python-iaq.html&#34;&gt;Python IAQ&lt;/a&gt;).  Chapter 12
provided good examples of how to do profiling for time (page 281) and memory
(page 291).  I like Tarek&#39;s @profile decorator (measure time, pystones
&lt;em&gt;and&lt;/em&gt; memory at the same time).  &lt;small&gt;My &lt;a
    href=&#34;http://pypi.python.org/pypi/profilehooks&#34;&gt;profilehooks&lt;/a&gt; module was
not mentioned, *sniff*  ;-).&lt;/small&gt;  Chapter 13 told me about &lt;a
  href=&#34;http://docs.python.org/library/queue.html#Queue.Queue.join&#34;&gt;Queue.join&lt;/a&gt;
and &lt;a
  href=&#34;http://docs.python.org/library/queue.html#Queue.Queue.task_done&#34;&gt;task_done&lt;/a&gt;
that snuck into the stdlib with Python 2.5 without me noticing.&lt;/p&gt;

&lt;!--
&lt;p&gt;Chapter 2 really ought to mention &lt;a
  href=&#34;http://docs.python.org/library/functools.html#functools.wraps&#34;&gt;functools.wraps&lt;/a&gt;
when discussing decorators and how the name of the wrapper function may make
tracebacks confusing.&lt;/p&gt;

&lt;p&gt;Chapter 3 presents a rare example of circumstances in which Python&#39;s
significant whitespace is a downside: the code example on page 75 is
syntactically incorrect (partly because of broken indentation), as well as
semantically incorrect (it shows the mechanism behind setattr, not getattr),
and the correction in the official errata list &lt;em&gt;omits the indentation
  altogether&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;At around page 95, according to my notes, I invented a new metric of book
quality: WTFs per page, It&#39;s closely related to &lt;a
  href=&#34;http://www.osnews.com/story/19266/WTFs_m&#34;&gt;WTFs per minute&lt;/a&gt;, but
independent of your reading speed.  Then, at around page 165 I got tired of
making a note of every little thing and started just reading.  This was
somewhat more enjoyable.&lt;/p&gt;

&lt;p&gt;I was happy to see examples of how to do profiling on page 281, and especially
examples with memory profiling with the eccentric &lt;a
  href=&#34;http://pypi.python.org/pypi/guppy&#34;&gt;Guppy/Heapy&lt;/a&gt; on page 291.  My &lt;a
  href=&#34;http://pypi.python.org/pypi/profilehooks&#34;&gt;profilehooks&lt;/a&gt; module was
not mentioned, *sniff*.  ;-)&lt;/p&gt;
--&gt;

&lt;p&gt;I haven&#39;t mentioned topics covered in the book that I was already familiar
with, such as setuptools, virtualenv, zc.buildout, Sphinx, Nose, Buildbot, or
Mercurial.  Yet, in my opinion, those are the most useful parts of the book.
The breadth of the topics is amazing: I could hardly think of something that
every serious Python programmer should know that isn&#39;t wasn&#39;t mentioned.  I
believe the depth was exactly right: mention solutions that are available, show
how they feel when used and what they can do, point to the relevant web page
and then stop.  And not only tools, the descriptions of workflows (how to
organize your source trees, how to develop software consisting of multiple
packages, how to make releases), while hardly universal, are invaluable.&lt;/p&gt;

&lt;p&gt;One thing prevents this from being a perfect book: errata.  At around page
95, according to my notes, I invented a new metric of book quality: WTFs per
page, It&#39;s closely related to &lt;a
  href=&#34;http://www.osnews.com/story/19266/WTFs_m&#34;&gt;WTFs per minute&lt;/a&gt;, but
independent of your reading speed.  At around page 165 I got tired of making a
note of every little thing that I noticed and started just reading.  This was
considerably more enjoyable.  I hope there&#39;s a second edition will all the bugs
shaken out.  To that end, I should go through my notes again and submit them
via the online errata form.  &lt;small&gt;Yay, more work...&lt;/small&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
