This series of blog posts explores the experiences in my background that led to an admission to Stanford. Inspired by Outliers by Malcolm Gladwell, I began thinking about how my own circumstances and chance encounters shaped who I am today. This is the first of five parts.
Developing competence in computer programming and software design is a process of exploration as well as trial and error. It takes time to learn common programming idioms (for example, to test whether an integer is even - take the variable mod 2 and check if it equals 0).
In one chapter of Outliers, Malcolm Gladwell discusses the background of the current computer titans such as Bill Gates and Steve Jobs. Both were placed in environments that allowed them to explore technology at an early age (high school and college). For instance, Steve Jobs lived near Bill Packard of Hewlett-Packard fame, and would ask him questions about his work. Gladwell argues that their future success is a function of this early exploration along with serendipity that the computer revolution was timed just right for their ages.
On my first reading, I thought about how nice it would be to have such opportunities, forgetting the many opportunities that I had to develop my computer abilities along the way.
The first computer I actively explored was in kindergarten - a Macintosh Performa. The computer was used mostly for game playing (X-Wing, Titanic), but it began to solidify my understanding of basic user interface components of the computer like folders and hard disks (back then, I only had 300MB, and I had to constantly switch which programs were installed in order to play what I wanted).
However, the first critical milestone took place in second through fourth grade when I began to use my elementary school's computers. I was slightly ahead of my peers in mathematics knowledge thanks to my mother's teaching, so my teachers allowed me to head down to the computer lab for hours at a time to just explore. There was little supervision except for the lab director, who assisted me with some of my first creative projects using HyperStudio. I wanted to create my own version of the popular game Myst, and this is the program they used (technically, it was HyperCard).
All of the hours in the computer lab would give me unparalleled tech skills for my age group - I was even helping teachers with troubleshooting when issues would come up in class. My enthusiasm was clear, and my teachers allowed me to explore this idea without interference. Unfortunately, I can only imagine what would happen today with the incredible focus on standardized test taking caused by No Child Left Behind. I am in favor of more accountability and more tests, but there has to be room to explore interests as well. The lesson: allow students with passions to continue building them.
My second critical milestone took place in fifth grade. I had become interested with the idea of programming my own games, but did not know how to go about doing it. It so happened that the district's technology offices were located in my school due to building cuts, and so I was able to talk to the director of educational technology. She offered and followed through with setting up a mentor who would drive from the high school to the middle school to teach me programming.
Amazingly, his teaching laid an absolutely great foundation for my future CS education. He helped me program my calculator (a TI-86) to play games like Tic-Tac-Toe while showing me the basics of loops and conditional statements.
While that relationship only lasted a school year, it gave me a foundation for understanding how to program well. I would later spend much of middle school and early high school learning how to program Java. The lesson: when a student is ready to embark on a new idea, giving him or her the right resources at just the right moment can jump-start the education process.
My third critical milestone took place in high school during tenth grade. I was playing Sid Meier's Civilization III, a fantastic game and series. I decided that I wanted to make a clone of this game using Java. I embarked by designing the primary game and interface on paper and began programming once school let out in the summer. I programmed a bunch of concepts myself like queues, stacks and network protocols, without realizing that anyone else had ever conceived of such concepts. After the program reached about 10,000 lines, it crumbled under the weight of its design, and I could no longer find ways to fix bugs.
That failure continues to be a major exemplar of the importance of clear design, and has always forced me to think through my designs a little more carefully before embarking on them. I did not follow Object-Oriented principles as well as I should have, and for that reason, my program failed. But along the way, I gained experience with almost the entirely of the Java libraries, knowledge that I still remember to this day. The lesson: summer vacations can be highly useful if applied to an intellectually-stimulating activity.
Computer science played a somewhat minor role in my application to Stanford (which was entirely focused on political science), although it was evident enough to make a nice connection. Despite several years of vowing to avoid CS and Math (to be explained in a later part), I eventually majored in Mathematical and Computational Sciences, and I continue to program to this day (right now, I am learning Objective-C).
As all of these parts will show, we are the product of our experiences. The reason that I can program well today is directly a cause of the experiences I had throughout my education which allowed me to develop my skill early, broadly and well. It is these kinds of experiences we need in American schools today if we are going to be successful in building a new generation of talented students. We have to nurture our children's passions and allow them to grow with the proper fertilizer. The results will be more than worth it.