Geoffrey Wu has built QBReader, a quizbowl practice site, and coauthored research on retinal-image analysis and neutron-scattering prediction. His own account of debugging QBReader is unusually concrete: it shows how a rare input, incomplete logging, and an inherited JavaScript property combined to produce an intermittent failure. The lessons below are bounded takeaways from his published writing, project record, and coauthored papers—not quotations or claims that every research result was his alone. Reference: Geoffrey Wu’s biography

Building QBReader
- Start with a specific unmet use case. Wu introduced QBReader as a way to read a chosen quizbowl packet online, with bonus questions and category filtering. He described the idea as emerging from a community conversation, then built a working reader around that concrete practice need. Reference: Wu’s QBReader launch post
- Let the first release expose the operating work. At launch, Wu still parsed and uploaded packets by hand and invited help finding a better process. The site’s initial usefulness did not require pretending that its data pipeline was automated. Reference: Wu’s QBReader launch post
- Improve the experience where use reveals friction. Wu’s later update lists practical changes: mobile support, more natural reading speed based on word length, and remembering selected categories and the last packet. He explicitly says the earlier mobile experience was barely usable. Reference: Wu’s QBReader development updates
- Make a specialized tool useful in several modes. QBReader now combines packet reading, multiplayer practice, question search and filtering. Its About page explains that questions come from released packets, are parsed into structured data, and can be filtered by type, difficulty, packet and category. The lesson is a description of the product’s design, not a claim that one mode caused its adoption. Reference: QBReader About
- Keep the source and correction path visible. QBReader credits contributors, links its source code, and asks users to report packet or categorization errors. That matters for a community-maintained question database where source material and classifications can need correction. Reference: QBReader About
Debugging Real-World Inputs
- Capture the input, not just the exception. When QBReader’s answer checker crashed intermittently, Wu had stack traces but had not logged the input passed to the failing function. He later wrote that recording it would have saved time. Reference: The Mysterious Bug in QBReader’s Answer Checker
- Use production-shaped data to find rare failures. His existing tests did not reproduce the crash, so he ran the checker across roughly 200,000 stored tossup answerlines. The failure surfaced near the end of that sweep; a small handpicked test set had missed it. Reference: The Mysterious Bug in QBReader’s Answer Checker
- Instrument the path after isolating a failing case. The answerline did not look obviously malformed. Wu repeated the run with additional logging until he located the branch that changed a token from a string into a function. Isolating a reproducible input made the deeper diagnosis possible. Reference: The Mysterious Bug in QBReader’s Answer Checker
- Check own properties when a lookup must exclude inherited ones. The word
constructormatched a property inherited by a JavaScript object. A membership test usingintherefore sent a function into string-processing code. Wu changed the test toObject.prototype.hasOwnProperty.calland applied the same correction to similar checks. This is a specific JavaScript failure mode, not a universal rule about every dictionary. Reference: The Mysterious Bug in QBReader’s Answer Checker
Mathematics and Models
- Many confirming examples are not a proof. In his essay on “engineer’s induction,” Wu shows patterns that hold for early examples and then fail. The practical distinction is between using examples to form a conjecture and claiming they establish a universal mathematical statement. Reference: Engineer’s Induction
- A counterexample can arrive far beyond routine testing. Wu’s examples include a number-theory conjecture whose first counterexample is very large. The point is not that empirical testing is useless; he calls it a quick tool. It is that a finite search cannot, by itself, certify an unrestricted proposition. Reference: Engineer’s Induction
- Compression can make a difficult prediction tractable: In coauthored Oak Ridge work, Wu and colleagues used autoencoders to compress neutron-scattering spectra into a lower-dimensional representation. Their framework combined that representation with symmetry-aware networks and synthetic data to predict one- and two-dimensional spectra from crystal structure. This describes the research approach, not a claim that compression always improves a model. — Oak Ridge — Direct Prediction of Inelastic Neutron Scattering Spectra.
- Combine complementary representations when one view is incomplete. In coauthored DVT-Net work, the team combined retinal images, vessel-segmentation images and topological summaries to study disease signals in vascular structure. The team’s implementation describes this as a research pipeline; it does not establish a deployed clinical screening system. Reference: DVT-Net implementation · Reference: Shenhav Lab publication record
Perspective Beyond Engineering
- A story can expose a personal blind spot. Writing about Ken Liu’s The Paper Menagerie, Wu connected the story’s themes of language, family and assimilation to his own experience as a child of Chinese immigrants. He described realizing how easily he could lose contact with parts of his heritage. This is his personal reflection, not a general prescription for others. Reference: Wu’s essay on The Paper Menagerie