This page chronicles some bits of history from my Python career, the Python language, and the software field at large.
I wrote this page to let curious readers know what it was like to teach classes and write books about Python in its earliest days. These were exciting and unique times that spanned a hugely dynamic period in the software field, and some of the titanic changes that happened on my watch can be spotted in the wild here. Because my training and writing careers also played a major role in Python's adoption, readers are invited to consider this page part of Python's history too.
Formally, this page mostly covers the twenty-five-year period from 1993 through 2017, though some of its story lines have been updated more recently. It itemizes the Python classes I taught, Python books I wrote along the way, and articles and interviews I did over the years, with totals for each category in parenthesis. For both context and color, I've also liberally seasoned this page with anecdotes, observations, photos, and jokes (a.k.a. memoirs but not the stuffy kind).
Three admin notes up front. First, this page's title is a clickable image that opens a photo gallery with extra notes; enable yours if it's hiding. Second, the items below appear most-recent year first; read from the end if you prefer to move forward in time (on this page, at least). And last, this sort of page is unavoidably first person, so please click away now if you're not interested in writing that's laden with "I" and "my." Some might even deem this page spectacularly self-promotional (if not egregiously egocentric), but such is the nature of career retrospectives, and you might find parts of it interesting anyhow.
All told, I've been using and promoting Python since 1992 and version 0.9. Here's the TL;DR recap of what I've been up to since those arguably dark ages:
Technically, 10 of the 40 years I've spent in the software field preceded my stumbling onto Python and included two degrees in computer science, work in the compilers and Prolog realms, and a first substantial program in 1982 using Fortran on punch cards (it played tic-tac-toe against itself and somehow always won). But such prehistory is officially outside the scope of this page.
More relevant here: today Python is generally counted as one of the top 5 most-used programming languages in the world; there are hundreds of Python books available on Amazon; and the local Barnes & Noble has an entire labeled section dedicated to the language. Among the best rewards of my career is the knowledge that my Python activities—whose beginnings predate the rise of Python, both Google and Amazon, and most of today's online experience—had something to do with that.
The rest of this page tells the stories behind the preceding section's numbers, grouped by year. If you prefer clicking over scrolling, here's a table of the year sections you'll find ahead (the floating Top button jumps here quickly if JavaScript is turned on):
To help organize the details on this page, its year-table entries are colored by type:
Terminology used here: Public classes were open to individual enrollments and most were held locally. Private classes (sometimes called on-site classes) were arranged for clients with groups and were held both locally and out-of-town. All my classes were private sessions as of October 2010 for reasons you'll read about ahead.
Where possible, this page's class tables list the names of clients that hosted classes, along with links to more info about each client. The links mostly lead to Wikipedia, which can be people-heavy and biased but suffices for quick overviews and more links. Please note that these host lists do not constitute endorsements of any kind for either Python or my training services and are included here for their historical value only. It is assumed that the passage of time makes naming hosts this way a moot point, but please contact me if your organization prefers anonymity (or a better link).
Also note the "(So Far)" in this page's title. Although this page by nature covers a specific period of time, the future remains to be written. While I don't mean to write it all here and haven't made substantial changes to this page since early 2025, websites are much easier to revise than books. Watch the books status page, peruse the general blog page, or check back here if you're interested in breaking news.
For the present, it's on with the past.
And the show goes on. In 2024-2025, I updated my most successful book, Learning Python, to swap coverage of the now-sunsetted Python 2.X for the latest plot twists in Python 3.X and reduce heft by nearly a third in the process. You can read about it at both its resources page and its cover-image's gallery Note.
In numbers, this update pushes my publishing totals up to 15 books and 12k pages, the equivalent of 24 500-page books and 40 300-page books. It may also move the sales needle for all print and ebook units closer to the 1M mark, though the absence of data for online readers together with the unfortunate prevalence of ebook piracy make this metric less meaningful than it once was.
More broadly, this edition marks a three-decade milestone in my Python books career. Its rewrite cycle consumed a full year, but the needs of new Python learners outweighed other factors in the end. I hope readers find the result to be useful and look forward to the Python world they will shape.
This year hosted rising book sales, another book milestone, and the continuation of a books saga born in the Internet Pleistocene. Though hardly plausible, this year also marked 25 years since I discovered Python. It's somehow managed to fill a quarter century with activity (and books with spam).
As expected, the combined sales on my books reached 600,000 units this year, led by sales of Learning Python's 5th edition (see 2014). This total doesn't include an untold number of readers who fetched free but illicit ebooks off the web (courtesy of my publisher's lack of protections for authors); counts just one Safari reader per month (thanks to my publisher's want of reporting transparency); and will naturally increase further in years ahead (note from the future: unit sales crossed the 750k mark in 2020).
Finer points aside, this is amazing sales in the tech-book domain, where 15k is often considered a success. Thanks to all who are part of the tally so far.
I didn't teach any classes this year, but a handful of requests came in anyhow despite last year's announcement. The most notable was from a prior client who eventually opted to hold classes taught by the students themselves—no subject-matter expert required. That particular class may fail, though it seems a new low point in the tech-education decline noted in 2012 and an alarming deprecation of knowledge in general.
This sort of thing has cropped up in world history before and always with catastrophic results, but you'll have to work out the consequences of the modern flavor for yourself (hint: one may rhyme with "boomsday").
My books' publisher stopped selling individual books in both print and ebook format at its own website this year, to push subscriptions to its video-focused Safari online service. Predictably, this darkened into a focus on selling customer access. The print books and ebooks are still being produced and will be available at other retailers, so this probably has little or no impact on readers—few of whom bought directly from the publisher anyhow.
Even so, it's a sad move for both authors (who may lose income in the shuffle) and loyal customers (who remember what the publisher once was), and is difficult not to interpret as another milepost on the road to content's demise. Read all the sordid details at the publisher review in 2015.
I regularly get emails from people around the world asking if I'm going to update my Python books again. The simplest answer is that as of late 2017, there are no plans for any book updates, and I don't expect any to come together in the future. My advice to readers is to master Python today with the latest editions, and browse its What's New documents later if and when you need them. Python will always change, but the fundamentals you'll learn in the books won't.
The fuller answer is that this is an ongoing tale, whose plot elements are introduced in earlier years here. In a nutshell, Python morphed into a subject too large and convoluted to be covered by comprehensive books, and my publisher morphed into a company seemingly focused on anything but producing them. Either one of these alone is enough to qualify as showstopper.
It happens, but it also doesn't matter. My books cover the first 25 years of the Python story and the vast majority of the language used by millions of programmers in countless applications. That coverage will remain relevant to all learners of the language for decades to come. So please enjoy the books wherever and whenever you find them, and don't forego reading one because you think a new edition may pop up shortly. You never know what authors might next do, but you can benefit from what they've already done.
As for this author: I may not be covering the parade anymore, but I'm still having fun programming Python (mostly on macOS these days and sometimes on Android). Check out the free programs I post on this page for recent code that's meant to be both useful and educational. And please feel free to consider them a thank-you to all the many readers over all the many years.
This year saw both book milestones and the expected and arguably overdue conclusion to the training story. On the former, Programming Python turned 20 years old this year, and sales of the Learning Python title reached the 300k units mark, not counting all the unpaid copies downloaded illegally on the web (information does not want to be free if it has a price tag).
Programming Python was first published in 1996, though its development (and lobbying) began a year or two earlier. Its content has spanned Pythons 1.X through 3.X and was the genesis of my other two books—Learning Python and Python Pocket Reference. Together, these three related books' sales reached 550k units by April this year and will continue to grow in years ahead.
For a look back at this book's history, see the earlier years on this page, especially its birth in 1996. Over the years, it grew into a mature applications text; maybe now it will finally move out of my basement...
After 20 years, 260 live and in-person classes, and more adventures than I can recall, I finally ended my Python training business in full this year. See the formal announcement for details. You can also read about some of the factors behind this decision in 2012 and 2010 below.
In short, it's high time to accept that onsite Python classes taught by subject matter experts for forward-looking groups have gone the way of the Norwegian Blue. This probably says something about society at large and almost certainly reflects Python's rise to ubiquity, but I'll pass on elaborating here. Instead, I'll close out the training thread on this page with thanks to all my clients for an amazing two decades and hopes that the books which mirror my former classes prove as useful to learners of the future as they have to learners of the past.
As for training, though, it has ceased to be. For posterity's sake, I've posted a few photos from the training road and the final version of the class workbook material. On my shift, the latter morphed from paper copies and floppy disks, to HTML, CDs, USB flashdrives, and the web. I don't know what comes next, but I'm sure we'll think of something. For now—roll the closing credits!
On-site classes were resumed this year after the preceding years' book projects but at a much-reduced pace. Publisher issues also began to cloud the prospect of future book updates; though some issues would take years to roll out (and others are beyond this page's scope), this year's review discloses enough to introduce the story line, and its later updates spin off a few sequels.
Despite capping a three-year sales peak, this year also saw some uncertainty over future editions. My publisher (now known as O'Reilly Media) passed on updating a classic Python book over a trivial contract issue and demoted both open source and books in general at their website. Once known for meaty technical books, this publisher seems to be morphing into a company focused on videos, webcasts, and conferences; with a business model based on pandering to a naive audience instead of educating it; and a web presence that has become a platform for promoting illegitimate content and personalities. This is not the publisher I signed up with.
Time will tell if legacies that established this company's brand are compatible with chasing the latest trends. Time will also tell if this publisher remains a net positive for my books. As it stands, though, its current image seems just as likely to turn away motivated readers as it is to attract them. Looking for solid technical material at this publisher's website today is like looking for Principia Mathematica in People Magazine.
As later years' events began to amplify the prior section's themes, a partial log was started here as info for prospective readers and authors. This was later moved to a separate page for space and flow but eventually dropped altogether in 2024 because it grew dated and moot.
In short, this log covered publisher issues and changes from 2015 through 2020, including payment, inventory, and support gaffes, as well as customer-facing focus shifts from books to online subscriptions and videos. Sadly, the shifts to online media also enabled ethically dubious sales of customer information and access. This company's web presence morphed even further in later years to emphasize corporate sales of online licenses, certifications, and AI chatbots, at the expense of books.
That being said, this publisher was also a catalyst for reaching innumerable readers over the last 30 years. Moreover, it's largely a different company today and there's much more to it than its web pages. For instance, it still actively produces books (now both printed on demand and sold as ebooks by third parties), and most of the issues of the past were addressed over time. Hence, the former "follies" log here is no more.
Given a choice of media options, though, this author recommends print books and ebooks over online options to protect your privacy. And please be skeptical of AI products: while they may be useful as supplemental reference tools, they are not learning and can do no better than the content they scan and paraphrase. This caution especially applies to AI tools whose scans are blatantly illicit; evil thrives only with audience support.
In the end, computer programming is a thing that requires determined, blood-and-guts problem solving of the sort that is well out of scope for AI chatbots and online blogs. If you want to do well in this field, your focus should be on deep-learning resources and hands-on experience, not quick answers which are often as inane as they are wrong.
These years were focused on two major book projects. A one-person training business is a massive undertaking, especially when travel is involved, and the book updates merited the complete and fulltime attention they finally received.
The 5th edition of Learning Python released in this period becomes the best-selling edition so far. It will hit 100k units sales early in its tenure; push the Learning Python title's lifetime sales well past the 300k units mark by mid-2016 (and cross 350k soon after); and easily outsell my other Python texts (people still want big, meaty tech books, despite what you may have heard). This edition also concludes with a warning about feature bloat and language flux in Python—a trend which continues unabated to this day (more on recent Python changes at this page).
With these years' publications, the total page count on the 14 Python books I've published over the last two decades reached 11,000. To put that number in perspective, 11,000 pages is equivalent to 22 500-page books, 31 350-page books, or 44 250-page books. To put the work in perspective, the latest Learning Python project was so intense that it killed a keyboard on a brand new Ultrabook. Yet another gadget that bravely gave its life to keep the world safe from bad programming-language design (more on device tragedies in 2006 and 2005).
Unavailable for training the first part of this year (due to another cross-country relocation) and writing fulltime as of October (which eventually became a two-year training break). This year also brought more clarity on trends introduced in 2010, per the next section.
Somewhere along the way, the recession impacts training budgets; Python sheds its newness and becomes an expected-to-know skill in jobs and an expected-to-learn subject in universities; and the world loses its mind and decides that complex technical skills like software development can be easily learned by watching a few hours of YouTube videos, copying code from unqualified GitHub sources, and following arbitrarily misinformed Stack Overflow advice.
While all three trends seem to have taken a toll on the in-person Python training field, the latter threatens a more disastrous impact on the software world at large. People may eventually realize that videos and webcasts are not training, cut-and-paste is not programming, and the knowledge of peers does not have the same innate value as that of subject-matter experts. But this may take time (and widespread software failure, unfortunately).
For my take on virtual training, see this note. For more on the cultural change underlying the drama, see the "democratization" of knowledge—a broader and strangely naive trend rooted in denigration of experts, which, if applied literally, seems destined to yield either economic decline or outright anarchy. In the software field, this trend's fruit sacrifices quality of craft in the name of a modern gold rush which is more marketing hyperbole than hiring reality. Knowledge requirements in engineering domains cannot be crowdsourced, despite what you may have heard.
Broader issues aside, a live in-person class is a tough sell to a crowd which has convinced itself that any skill can be had with a quick tour online and for proof can point to a multitude of inane dreck available for free on the web. Trust me on this; nothing captures the impact of the Internet quite as well as watching students search for answers by wading through advertising-laden junk sites, instead of asking the real expert standing three feet behind them.
On the other hand, my books' sales in this same period are stronger than they have ever been and will increase further in the years ahead. Perhaps there is hope for the Rebellion still.
On-site training resurges. I stopped training as of August this year to avoid being too busy; this wound up being a full year break.
Memories from the road this year—a snow day in Boxboro, subzero cold in Chicago, a tornado warning in Bloomington, homeless people in San Francisco, and a lost belt courtesy of an antagonistic TSA agent in Boston's Logan airport. Business travel is losing its luster.
This year also saw returns to government research centers whose bread and butter is sensitive information. At one, I ran a Python online-lottery program to give away free copies of my books. This was both fun to code and an excuse to pare down my inventory, but it had a major design flaw: entering the lottery required sending an email or filling out a web form, and security restrictions at the site made this impossible—that is, until students pulled out their smartphones to get online anyhow. Good thing they don't make bombs, eh?
This year saw the end of public classes; the last three were held in Sarasota. In short, more and more public-class students were showing up with highly over-inflated expectations, and it became unethical to take money from individuals in this context—as the following section explains.
By this time, Python's original message of a better tool for developers had become a promise of easy accessibility to everyone. Sadly, one of the byproducts of this myth was an increasing number of students enrolling in public classes with no background in programming but expectations of mastering every topic under the sun and launching a software career after just one 3-day class.
Disreputable marketing in the publishing and training fields was no doubt a big factor behind this shift, but a general cultural change which denigrated both the software field and traditional learning was also gaining momentum (more on this in 2012). Whatever the cause, profiting from the desperation of misled people is just plain wrong. After a decade, the public classes launched in 2001 wrapped up with this year's Florida sessions.
By contrast, private classes and comprehensive books are targeted at very different audiences—the former at groups with specific job-skill requirements and the latter at individuals seeking in-depth coverage. Although some private classes' initial expectations were wildly inflated too, the tangible reality of the format made it possible to negotiate a realistic syllabus (or pass altogether). And while book readers come in all shapes and sizes, it's difficult to imagine any mistaking 1,600-page works for quick skims.
Still, the tech education field is sorely in need of realism. Programming can indeed be fun, in the same way that climbing a mountain is fun. The journey is arduous and part of the reward. But software engineering is not, and never will be, a trivial skill to master. Promising otherwise is at best naive and at worst fraud. Either way, the net result is to both disappoint newcomers and dilute the field.
Most of this year was still local classes only (and referring contacts to others), but the London class in December signaled a restart of travel-based classes which continued into later years. Book update projects were also underway much of the year—necessitated by the need to cover the newly released Python 3.X. Much of the work on books this year was done during a cross-country move and some of it on a cramped netbook.
The Programming Python update is pushed out to next year. It will be held in limbo for months by the publisher, and have to grapple with half-finished 3.X libraries that are still being brought in line with 3.X language changes and are sufficiently incompatible to make 2.X-to-3.X migration a lot more complicated than running code through a syntax converter. In the end, many standard libraries won't correctly handle 3.X's Unicode model until years after 3.X's release—further slowing its adoption. Moral lesson: if you're going to mandate change, you should at least have the common sense to practice what you preach.
On the upside, Python 3.X will eventually become fully usable for applications work, if programmers are careful to stick with its large subset that applies to all 3.X versions (see the programs posted here for prime examples). Unfortunately, the siren call of latest-and-greatest inevitably lures many a coder to the rocks of incompatibility. There's more on the Python changes story here and coverage of 3.X's near stillbirth last year.
This year was local classes only, a continuation of 2007's mid-year change and a policy that also lasted for most of the next year. Even so, a single longstanding client sufficed to fill some of the time—and give my second OQO a workout when a laptop failed to project.
The deliberately backward-incompatible Python 3.0 is released late this year—by most accounts an atrocious misstep, which is no longer mentioned in 3.X circles. The Python 3.X line will eventually become more robust and efficient but remain a constantly morphing sandbox of ideas which will struggle to attract users and will even alienate some former Python fans. By contrast, the Python 2.X line will soon be frozen at version 2.7 and hence immune to 3.X's thrashing; despite 3.X's emergence, 2.X will continue to see widespread use (and probably always will).
By 2020, Python 3.X will be used widely enough to embolden its developers to drop support for 2.X at python.org. But it will take a full 12 years to get there, and even then 2.X will still be used by countless programmers (see ActiveState's data and blog), and it will still be supported or required by numerous systems (including IronPython, AWS, Chromium, Jython, and LLVM). Python 3.X may be the future, but its dozen-year ascent hardly qualifies as a coup, and it may never eclipse 2.X's legacy in full.
The enduring popularity of 2.X won't, however, stop python.org developers from inserting a rude denigration banner at the top of every page in 2.X users' docs. For an open-source community that prides itself on being inclusive, that seems awfully exclusive.
This year was a turning point for training: for happy personal reasons, I stopped doing out-of-town classes at mid-year and did only local classes (public and private) from then until December 2009—a business travel break spanning two and a half years. This was still a high-demand year and I passed along a lot of business to others, but personal lives sometimes matter more than careers.
This year also saw the release of the 3rd edition of Learning Python: a heavy revision that incorporated new training experiences and dropped the material of the prior edition's coauthor (who elected not to work on the update). The new edition was also temporary host to both arguably annoying "Brain Builder" section labels and definitely distracting code section pointers added by the publisher over my objections. It enjoyed strong sales until Python 3.0 forced an update ahead of schedule.
⇨ Good ⇨ thing, ⇨ that!
The peak year for training, though 2007 would have probably been similar if I hadn't taken a break from travel. I likely spent more time in hotels this year than at home. In fact, the pace was so busy that I had to pencil myself in as unavailable for classes in September to get a break (and meet someone who would change my life profoundly next year). A large book was also somehow written this year; much of the work was late-night hotel vigils.
Among training notables: classes amongst the Chicago skyscrapers; a New York class near the now heavily armed Wall Street; lost luggage in Edmonton which made for an interesting wardrobe; an OQO Windows-based handheld computer doused badly in London by an errant pint of Guinness; and a class on the Google campus. The Google class almost didn't happen, because I refused to allow background checks which involved a private investigator and were more invasive than those of the NSA. (That's how I know they're different.)
The second-biggest year for training. Tech, Python, and programming in general were surging. This was also the last year that I attended conferences; after doing 12, they grew repetitive and stale for me, unwanted attention was becoming a burden, and I already had a heavy-duty travel schedule for training.
This year also saw a return to Puerto Rico (and the best shrimp on the planet); a disabled laptop (thanks to an unfortunate Diet Coke incident in Berkeley); and a hands-on look at a NASA virtual reality cave (before VR was cool). A second hurricane off the coast near St Augustine added color to the Palatka class, and a Colorado blizzard delayed arrival to West Palm Beach.
The Big Nerd Ranch public classes in this year and the next were held at a retreat in the Georgia woods, where students and instructor would stay, eat, and share a week-long learning experience while largely cut off from the outside world. Yes; cue the banjo.
The dot-com effect ebbs, and a recovery seems to be afoot. Conferences were already starting to get old for me by this point; I stepped out of the DC PyCon to watch a US presidential campaign rally down the street.
This year's training included a beach stay in Florida, a 1-person class in Fresno, the remnants of a hurricane in Newport News, and an NSA class which banned student CDs I brought along (training takes on a different tone when the client has automatic weapons). I was also asked to provide a final exam for students at Circuit City's HQ; so I wrote up an easy exam filled with jokes; which most of the students failed...
This was a low-point for training demand and seems to be the year when the full impact of the dot-com crash's downturn hit. I cancelled only one public class due to low demand and it was in March of this year. My publisher nearly folded in this timeframe as well. That would never happen to this field again, right?
Despite the decline, this year had its share of memorable training moments, including a return to Dublin, the Big Dig in Boston, and tours of both a control room at Disney World and a movie studio lot in Culver City. In the books department, Learning Python, 2nd Edition is released with new material from recent classes and Python changes; this wound up being a one-person job but retained the prior edition's coauthor material.
An early high-point for training and an apparent vindication of the career move. The dot-com burst had happened but hadn't hit training demand yet (though see next year). This year was also my fourth and last OSCON, an event that will be held until it falls victim to publisher morph and pandemic in a distant epoch.
This year's training trips to Barcelona and Mexico City were rewards in themselves. The Barcelona trip included an entire weekend to explore, with a day spent on Las Ramblas and the Mediterranean (photos here and here). The Mexico City trip saw squash games, amazing food, and a tense moment when a plainclothes police officer jumped into my taxi as a random kidnapping deterrent. Spoiler alert: I'll return to UW in Seattle 13 years later, when nobody will recall the class held there this year.
Growing training demand and the first of many book updates to come.
Early public classes in this year and 2000 were hosted by a Perl training company based in Boulder, Colorado (TCPC); I eventually started holding these in Colorado myself this year. Also this year: both an OSCON (held by my publisher) and an IPC (held by Pythonfolk), though conference details this far back start to become a bit murky, due to thinning Web records (and memory); t-shirts seem the best definitive proof remaining for some. Older conferences may still be spotted here, here, and here.
This year's 2nd edition of Programming Python was a very different book than its predecessor. Given the presence of Learning Python's language tutorial and the Python Pocket Reference's quick-reference, the new Programming Python edition is able to morph from a general and broad text to a focused and more-advanced applications tutorial. This scope remains with the book in all its later editions. It probably should have been rebranded as "Applying Python" or some such at this point, but the publisher had already established the title model.