When I was 10, my father wrote a simple java-script for me to display images in a photo gallery. After I figured it out, I went to the regional library and self-learned, successively, C, C++, and PHP. Then I learned about MySQL and started building web applications. In 2003 I coded a games server with a few games I wrote. It allowed users to create accounts and kept track of their scores in games. Another project of mine was the never-ending photo gallery. My family went hiking often, and I uploaded selected photos to the gallery. I haven't updated it in a while, but it's still up.
Play the Random Maze, a game I wrote.
Eventually I went to college. I took the second quarter of the introductory programming sequence (in Java). I wanted to take further CSE classes, but they were major-restricted, so I applied and was admitted to the major. I re-learned C, and I consider myself to be a good C programmer. I also took a class on formal models (a sort of math class for CSE students), a class on different kinds of programming languages, a class on data structures and algorithms, and a class on compilers. However, before taking those classes I had already read about many of the concepts we covered. For example, I had previously built a parser from scratch (we used a variant of Lex/Yacc, a tokenizing/parsing utility, in compilers).
My favorite sequence was hardware (370/8, no longer offered at UW). I was really good at assembly, and for one of the projects wrote a program in MIPS assembly from scratch because I didn't realize that a skeleton was provided. Thus I learned how to program in MIPS. Of course, we also covered the more practical X86 assembly paradigm, which I also excelled at.
The course, however, was initially more about designing logic circuits than assembly programming. However, a logic circuit is just a very low-level program, and I enjoyed learning about them a lot. Here is one of the labs where, instead of building several circuits successively, I put them all on one board.
(A rather technical and long) demonstration of a CSE 370 lab, 5 min 3 sec.
We then switched to building circuits using software. The last lab of the quarter involved building a card reader. My partner and I were a little late with the project, and there was nobody in the lab to check it, so I made a video and sent it to the professor. Needless to say, we got enough credit for it.
Demonstration of the last lab in CSE 370, 1 min 11 sec.
The next quarter had the assembly component and involved building a processor using the tools we learned. The final project for the course involved writing some C code do move a ball on the screen, to compile the code into MIPS, and run it on a processor we built. I decided to have some fun with it and wrote a game of pong, even though it meant staying in the lab for two more days debugging it. In the end, the program worked, and I invited two friends to demo it for another video.
Demonstration of the CSE 378 final project, 1 min 30 sec.
I also left the board/program running for anyone to find. I know that at least a few upperclassmen or grad students played with it.
My first paid position involving programming was after my freshman year - I signed up through a math professor, who was the lead developer of the SAGE system, and we submitted a proposal to Google Summer of Code via the Python Software Foundation. The proposal was approved, and that summer I worked on implementing interactive features in SAGE.
Then, in the summer befor my sixth year I became involved with a research project in the quantum computing group. The topic was computational group/graph theory. I had to write efficient C/C++ interfaces for modern graph isomorphism / automorphism finder packages NAUTY, SAUCY, and BLISS and to run them on certain graphs. I also had to write code in GAP, and I used SAGE for some applications. My work in the summer and fall was funded by the NSF through UW-CSE. I no longer have funding, but intend to finish the project.
In 2011, two classmates and I started taiLib, a web service for students to find textbooks to loan to or borrow from each other. We met weekly and hacked up a functioning web site.
Then we sat down for a game of Settlers.
Today the site is free to use for UW students. I have invested a significant amount of time into taiLib and plan to continue advancing the service.