After spending so much time thinking about measuring and monitoring productivity, I realized
that a separate but somewhat related problem in my own life was establishing and maintaining
habits. In particular, I seem to have a tendency to start to do something (such as write
my thoughts or reflections down regularly) but then after a few months, I would lapse.
In between building Life and Starter,
there was actually another project "Lens" (orginally Life3) that was built ontop of Meteor.
I usually prefer to talk about the "why" of my projects than the "what" as it pertains to the
particular technical stack that I use, but in this case my choice turned out to be a disaster.
Lens was meant to be a website building and organization application that leveraged paths instead
of hashtags to link content together. I still actually like a lot about the original publicity
settings of that project, but building it in Meteor was a huge mistake. I trapped myself into
a walled-garden that eventually became impossible to build in anymore.
In the summer of 2017, I decided to revist one of my favorite books on game physics engine
design but this time with the intent of implementing a "Battlebots"-esque web application
that let users submit specifications for bots to batter.
Starter is my personal
take on a task tracking and management website similar to Trello or Maniphest. I started
building this project after realizing at a Dropbox hackathon how much nicer it was to build
websites in Python rather than Node.js. I was starting a new "starter" project (one that
I intended to fork multiple times but without much other than boilerplate itself) but then
ended up keeping the name and iterating on it over the past couple of years.
At the end of my senior year of undergraduate at UT, Josh Slocum, Dillon Walker, and I were bored and
couldn't decide what game to play. We had recently been playing a game at
agar.io and were having a bit of fun, but decided we wanted to write our own
game instead. We initially spent approximately 3 hours working on the game and after these initial 3 hours
we had a working multiplayer game which is demonstrated in the video linked above.
Upset by my recent habit of hitting snooze many times every morning, I decided to try to make an app that
forced me to get out of bed and face the day. I mainly wanted to make the app to familiarize myself with
the new Android Studio and some of the Android features I had never used before like accessing the camera.
The overall idea of the app was to make an alarm clock that required me to go to a separate room and scan
a smiley face before it would turn off in the morning.
After my first semester of school senior year, I was looking for a side project to work on over the winter
break. I remembered back to one point in my life when I had wanted to try to keep a journal of my life so
that I could read it in the future and remember everything that I had done as a kid. Starting a journal was
something that I tried to do multiple times but each time I only managed to make it a few days before
forgetting about it or getting frustrated with it. I decided I wanted to try to start a journal again, but
this time I thought of ways that I could leverage the myriad of APIs that already track the events of my
life to help me.
Recently I was using the Snapchat messaging functionality that allows messages to be read only once and
although I liked the idea, their interface for it was awful. Because of this, I set out to build a
similar messaging service that would also work on the web through shareable links. In the end, the
service converged to a system like email, with a subject and a body, with the body only being able to
be viewed once. I implemented this by having two records in a SQL table for each message, a metadata
record that stores the header and information about who sent it, and a message record that stores the
actual content of the message. The only request that can retrieve the content of the message deletes
the record from the database so that it can only be read once.
I was preparing for an interview with Imgur in my senior year of
college and one thing I decided to do was familiarize myself with the technologies they said they used
on their public blog. I went about this by trying to implement as much as Imgur as I could and I got
pretty far (except I ended up using node.js instead of PHP). The application I made was a node app
written in Coffeescript that uses MySQL (with an ORM), Redis for image ranking, and nginx.
At HackTX 2014, my college friends and I decided to make a web application that could potentially
replace display advertising on the internet. The inspiration for this project was a project called
Tidbit, which mined bitcoins in a browser
when someone visited a website. We like to think of this approach as a way to pay for the websites you
use everyday with your CPU cycles (after opting in) instead of your personal information (which is what
targetted advertising today relies on).
After my internship at Dropbox I became interested in ways that people collaborated in documents. I set out
to emulate the Google docs product or at least the real-time collaborative editing part. I read through some
of the research on the subject and settled on
this paper that was able to
provide collaborative editing without the use of operational transforms. An implementation of this paper in
a textarea element using Firebase as the backend is what is available at the demo link above.
A fellow Dropbox intern and I in the summer of 2014 got together with a full-time designer who was new
at Dropbox and a mutual friend to build something for
Y Combinator Hacks 2014. We met
several times before the hackathon to discuss ideas and how we would build them and eventually settled
on building a lightweight event planning tool to facilitate planning short-lived or spontaneous events
like grabbing dinner with some friends for instance.
In the middle of February of 2014, a phenomenon called Twitch Plays Pokemon (TPP) swept the media and
my friend group. The idea was to stream the playing of a video game in such a way that the people watching
could submit moves to the game and either make progress or cause mayhem. More information on the original
game can be found in a nice writeup on
Wikipedia about it.
I have always enjoyed physics and the math behind it so when I learned to program, some of the first
things I made were physics simulations. This is probably the fourth or fifth one
I made but it was the first to include many complex collisions in 3 dimensions.
My college roommates and I built what we eventually called "Dwopbox" during HackTX 2013. We were
surprisingly successful during the hackathon and actually
won the "Hacker Lounge" prize
for this project. Dwopbox is a peer-to-peer file sharing system written entirely in Javascript that
uses WebRTC channels to transmit files.
In my operating systems class first semester sophomore year, my project partner, Adam Faulkner, and I set
out on an ambitious final project. The class required us to build an operating system called
JOS using some skeleton code. We got to
start by implementing the bootloader in x86 assembly and slowly moving up through memory management, file
I/O, process communication, and eventually a functioning shell. Our professor had us choose whatever final
project we wanted so Adam and I chose to enable graphics mode and write some cool programs to run on our
operating system.
I implemented a 2-dimensional bouncing ball simulation to experiment with Javascript's access to device
accelerometer data and the math behind momentum based glancing collisions. It was a lot of fun to derive
the math behind elastic collisions that aren't head on. One interesting result of this was a almost
labyrinth-style simulation on mobile devices (and some MacBook Pros). You can see the working simulation
at the link above and the source code is hosted on GitHub.
After my first internship, I my friend Adam showed me his intern hosts website which had this cool effect
where it turned a random image into colored ASCII text and rendered it. I wanted to emulate the same effect
so I made my first student website at UT Austin (originally at cs.utexas.edu/~david) be a page that
converted three chosen images into black and white text, colored text, or showed the original photo. Over
the years I tweaked this page as I added more projects and did more work before eventually purchasing my
first domain (davidw.com) and making a new website for it.
In my sophomore year of college I was telling my roommate about when I used to write bots for RuneScape when
we thought of a challenge for each other. We were both addicted to playing the
Tetris Battle game on Facebook and wanted to see who
could write the better program to play it automatically. I was able to get a working program out by the end
of the week and definitely won the contest, plus I learned a lot along the way.
Towards the end of high school, I became really interested in how to render 3D scenes. I started out by
trying to write some Java applets that used a lot of vector math that I derived myself to render points.
This approach didn't workout however because I could never render anything more than wireframes. My
freshman year of college however, I took a linear algebra class and got to learn all about matrices. To
help myself learn, I wrote a matrix library in C for fun and then to show it off, I started reading papers
on how graphics rendering works on GPUs today.
RuneScape was actually the thing that caused me to love programming. RuneScape was a game written as a Java
applet that could be "botted" (or automated) by modifying the jar (to add some accessors) and writing
complicated scripts to interact with this hacked client. I found out about these scripts right around the
same time I was taking a computer science class in high school, and I quickly realized that I could write
them. It was a tremendous amount of fun. Whenever something in game got too boring, I would just write a new
script to do it for me automatically and share it with the world for free. I made a
website
that had links to all of my scripts and instructions on how to use them as well as
analytics that I loved watching as more than fifty thousand people
from all over the world enjoyed what I had made.