The Importance of User Testing (Tea Timer Too)
In part one of this series, I described refining my tea timer as sanding off burrs. I did smooth out my surface-level experience, but my familiarity blinded me to fundamental cracks lurking below. The most powerful method for unburying these faults is user testing. In my day job, we rely on testing with our customers to perfect our software, uncovering both bugs and new features. User testing has also been invaluable for many of my side projects (especially the games). A second pair of eyes is worth its weight in gold but is often just as difficult to acquire.
Tea Timer
Brewing tea is a simple process of using water to extract the bits from tea leaves. Top minds have been doing this for several years, coming up with a general idea of how long one is meant to leave the leaves in the water. Unfortunately, as a rather forgetful person, my usual tea steep of 15-30 minutes falls outside of the expert opinions on the matter. The normal way to fix this would be a phone timer, but my forgetfulness has gained the ability to silence the timer and move on without informing my brain. I embarked on a new project, creating a timer that would force me to collect my tea.
Bluetooth Rotary Phone
Old technology is just the best! It clacks, thunks, and makes all the other tactile noises one could ever need. I had the idea to make a rotary cell phone way back in high school, but when I priced out the fancy electronics required it was far outside of my budget in terms of both money and expertise. I buried the idea in my mind’s bog of unused concepts and did a few things for a couple years.
Untangling WebSockets
I have a confession to make. I enjoy reading RFCs. I love the ascii-art technical diagrams, the ruthless exposition of edge-cases, and the frenzied all-caps MUST, REQUIRED, and SHALL.
Let's Make a JavaScript Bundler!
WebPack, Browserify, and the billion other JavaScript bundlers out there are black boxes into which we feed source code. While these existing tools work quickly and correctly, it’s educational to see the challenges that went in to developing them. This blog will lead you through the journey of creating a JavaScript bundler. Along the way you will learn about abstract syntax trees, digraphs, code generation, traversal orders, scoping rules, and function isolation.
CMS.609 Program 0.5
A class I am taking this semester, CMS.609: The Word Made Digital, involves the creation of four to eight computer programs. These programs are intended to explore the intersection of technology with literature. I will write a blog post for each program to discuss my process and artistic intent. This first entry details the creation of Program 0.5. What follows is a story of the wonderful benefits of overdesigning a simple system.
Low-level Optimization in a High-level Language
A year ago I took Performance Engineering Optimization. The first lecture launched into a study of matrix multiplication. Starting with a simple python program, the professor ran through a series of optimization techniques that sped up the program by a factor of 52,479. However, the first step in this process was to switch to C. I began wondering what would happen if we had stayed with Python or another high-level language. I have finally followed through with JavaScript. Read on for a whirlwind tour of low-level optimizations and a few JavaScript-specific tricks.
The First Project
Phones break. Firefox OS phones break too (for now). This breaking usually leaves behind visible trails that reveal what caused the initial break. In physical terms, if something hits your window it will leave cracks that will be different based on whether the object was a golfball or a brick. If you are lucky, you may have a security camera that happened to take pictures of the window-smashing object.
Why Rust is better than C++, a case study
For the past week I have been working on transferring LLVM’s wonderful Kaleidoscope tutorial to Rust as a way to gauge the possibility of finally introducing a proper REPL into the language. I am still working on getting the JIT compiler functioning, but I thought I may as well document some thoughts about where Rust is infinitely superior to C++ and where it still needs some improvement.