I did not learn Python for Python. I learned it because I wanted VPython—the library that gives you 3D vectors, spheres, and arrows you can push around with real physics, in a window, with almost no ceremony. The language came along as the price of admission. This is how most of my skills arrived: HTML came because a paintball team needed a website, and Python came because I wanted to see things move in three dimensions. I learned by working toward something I wanted to build.
The first thing I wanted to build was a live picture of logs, something like Logstalgia, which watched Apache logs and turned the traffic into motion. At the office we already had visual logs up on several screens, and when something went wrong, people who were not looking for problems noticed anyway. What they noticed always turned out to be a real issue, which made the idea interesting. I wanted to build one of our own.
On the visualpython-users mailing list, I asked why the Ubuntu packages segfaulted on Karmic. I asked about wireframe mode. People who knew the library read my reports and helped me work through them.
The questions soon became more specific: the segfault report becomes a matrix—Python 2.5 against 2.6, 32-bit against 64-bit, then released Boost against its trunk. One trunk configuration worked, but it also changed the VPython version. In a follow-up I reported that the original 5.11 tests also worked against that trunk, with separate shader and material failures still present. That narrowed the search while leaving other build differences to investigate.
Soon I was arguing for a clean top-level package whose imports did only what the caller requested. I floated vpython, vispy, and visuallib as names. This vispy was a candidate name in that thread, not a reference to the later VisPy project, which did not yet exist. The next day Bruce Sherwood published the experimental code under vpython.
By the time VPython 6 was in development, I was asking where VPython 6 development lived so I could get a Linux demo built. Later in the same thread, I was answering an adjacent dependency failure with apt-get build-dep and Debian’s source-package tools. My replies now included commands for investigating the build, alongside questions about how to get it running.
I wanted clean importing: a 3D library that loaded without deciding more than an import should decide. That interest continued into lazy imports, import machinery, and module objects that behave like other objects. I had learned Python to put spheres on screen. Getting the library to work kept exposing more of the language underneath it.