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.
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.
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.
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.
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.
|Development of Interact in SAGE|
|Mentor||Prof. William Stein|
|Funded||Google Summer of Code|
|Abstract||This project is aimed at improving the Interact feature of SAGE, a large Python-based library for algebraic and symbolic computation. Interact allows the end user to dynamically reevaluate output of Python scripts by changing controls in the output, rather than modifying parameters in the code. In this way, SAGE Interact is a way for anyone to very easily create web-based graphical interfaces to Python programs. I propose to create a web server and interface for displaying and sharing the interactions produced with SAGE Interact. In addition, I propose to improve the Interact feature by improving the existing controls and adding new controls.|
|More Info||Sage Day, August 6|
|Blog||Interacting with a Complex Plane|
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.
|Computational Group Theory|
|Mentor||David Rosenbaum, Prof. Aram Harrow|
|Period||June 2012 - present|
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.
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.
|Position||Co-founder with Alan Chen and Tom Guo|
|Period||January 2011 - present|
|Check it out!||http://www.tailib.com|