Moving fast
In 2010, Mark Zuckerberg famously said that the key to success is to “move fast and break things.” From an external perspective, “moving fast” means shipping new features and products at a healthy cadence. Internally, an engineering organization moves fast when its engineers work on problems of value as efficiently as they’re able.
Keeping track of passwords
I’ve recently changed the way in which I handle passwords. Some folks have asked me about it, so I figured I’d share.
Rootkit design feedback
When I was in high school, Kazaa was everyone’s primary source of pirated music and viruses. I made a reasonable amount of money fixing virus-infected Windows XP machines for friends-of-friends. I’ve been proud to say that I hadn’t (to my knowledge) been affected by a virus. Sadly, my streak came to an end this week. And on my Linux desktop, no less!
Poor man's asset management
One of the challenges of web development is figuring out how best to use the browser’s download cache. When you surf the ‘net, if anyone uses that term any more, webpages and images aren’t downloaded every time you access them. The browser saves that extra work, time, and bandwidth by caching resources – images, pages, scripts, and styles – it’s already downloaded. But what happens when you DO want the browser to download a new version? Say you updated an image and want to make sure that the user has the latest content. How do you instruct the browser to download the new version?
Yearly vesting considered harmful
Tech companies will often include some sort of equity in their compensation packages. It’s an excellent way to motivate employees, as they’re literally invested in the success of the company. How that equity is distributed, though, can have a massive impact on incentives and team culture.
Goodbye, Tumblr! Hello, Jekyll!
As of today, I’ve officially migrated this blog from Tumblr to Jekyll. Finally!


Worse is Better in the Play Store
One of my favorite essays is The Rise of Worse is Better by Richard Gabriel, which describes the distinction between what he calls the “MIT approach” and the “New Jersey approach” with respect to software development.  In short, the MIT approach is about solving a problem correctly and completely from the start.  That is, every possible use case and functionality is carefully designed up front and the result is a beautiful, complete piece of software.  The New Jersey approach, which Gabriel describes the philosophy behind UNIX and C, is to build systems iteratively, perhaps at the expense of building the perfect solution.
PhoneHome: Remote logging for Android
Building Hoot showed Christina and I the ugly side of Android fragmentation. Hoot is currently running on over 1600 different device models on five different versions of the Android OS (>= 4.0), and it makes extensive use of the hardware: multiple cameras, the light sensor, and the orientation sensor. Unsurprisingly, given the number of different configurations, we’ve seen some weird behavior: crashes, incorrectly-rotated videos, and even videos recorded in sixplicate!
Serving authenticated media with nginx
In the last few months, I’ve been building Hoot, a private video messaging app for Android, with my business partner Christina. Part of a video messaging app is hosting and serving – you guessed it – videos. Hoot’s videos are served off the filesystem by nginx on a shared media server, separate from our application servers that process Hoot’s API requests.
On hiring
Hiring good engineers is really, really hard. These days, it’s a seller’s market, and a top candidate will almost certainly have a number of competing offers with all sorts of shiny perks. I’ve done some hiring in the past, and I’ve tricked some great companies into letting me work with them. For whatever reason, I’ve had a disproportionate number of conversations about hiring and being hired recently, and I figured I’d share some nuggets that have come up.
A month with Dell's Project Sputnik
I ordered the new Project Sputnik laptop from Dell to replace my six-year-old MacBook. It’s basically the most-tricked-out version of the XPS 13, running Ubuntu 12.04 instead of Windows 8. I won’t get into why I dislike Apple’s OS, but I run Linux on my desktop and on any server machine I login to, and I enjoy a consistent experience. The most appealing part about Project Sputnik, as opposed to installing Linux on any ol’ Windows laptop (or a MacBook, for that matter), is that it includes a Dell-managed PPA for the hardware. In theory, this means that Dell is committed to making sure that the laptop’s hardware “just works”.
Contracts and expectations with data APIs
The phrase “application programming interface” (API) is officially quite generic. It encompasses interactions between software components as tight as data structures (e.g. C++’s standard template library) and as loose as structured queries over the Internet (e.g. GitHub, Yelp, Yahoo! Finance). A piece of code that exposes an API offers a contract with its clients: “if you interact with me in this particular way, I will perform these actions or return this data.”


Pulse-width modulation, hysteresis, and transferring large files. Oh my!
I came home from Thanksgiving with a bloated stomach and few enormous files that I planned to back up on my home computer. These files were on the order of ~100s of GB and left me only about 30GB free on my laptop hard drive. And now, fair readers, I will share the harrowing tale of… The File That Wouldn’t Fit Twice. Using a couple of electronics tricks learned in ME210, I ended up with a pretty neat solution to transfer these huge files to my server.
Staying curious
My grandfather is an impressive man for a number of reasons, but one thing that continually amazes me is how curious he is. He’s a voracious learner, reads everything, and figures things out on his own. In general, computers are more difficult for grandparents. They constitute a paradigm shift in how we consume and produce information, and the more people are ingrained in traditional means of doing so (e.g. print, television, radio), the more difficult it is to start using computers.
I scream, you scream, we all scream for unit tests?
I’m going to go out and say it. I love unit tests. Hopefully, by the end of this post, you will, too. I’m not going to cover the pros and cons of various frameworks in each language, the best way to mock out data dependencies, or even the secret to writing impeccable unit tests. There are enough resources, and I hope that you’re inspired to seek them out. In case you aren’t convinced that unit tests aren’t the best thing since sliced bread, I’ve brought my old friends from Office 97, the Screen Beans people, to help me.