When I was sophomore at UMass, I entered the Mechanical Engineering program, thinking it would eventually lead to a course in Engine Design. At the time I thought "What ME program doesn't have a course in Engine Design? / Of course they do![1]". I had spent the year before college working as a mechanic, and it always used to occur to me when repairing a car "This could really be designed much, much better."
Since I had always loved programming, I took an elective that fall semester: ECE242 Programming With Algorithms and Data Structures, taught by Professor Sandy Hill. This was not an ME course, it was under the Electrical and Computer Engineering (ECE) department.
This was a pivotal time in my life, and I was asking a lot of fundamental questions of myself. E.g.: what is a good way to be? And: who should I become? I didn't realize it at the time but I was looking for guidance, mostly in the form of role models. I wasn't sure who I wanted to become, but if I could find some examples of people who possessed the qualities I wanted to develop within myself, that would be a great starting point.
ECE242 was taught in this tiny internal room (in Marston Hall) because it was part of a remote learning program at UMass, in which the lectures were broadcast over satellite to a handful of locations, so not everyone had to be on campus. The remote "students" were mostly engineers in industry. Dr Hill used a sharpie to provide instruction on little square pieces of blue paper, which were filmed from directly above by a camera and beamed in real time over the satellite network.
I have very fond memories of his class. Unlike several of my previous professors, Sandy was incredibly patient and responded to all questions as best as he was able. He was also wonderfully charming, and never lost his cool. He had a soft-spoken voice that made it impossible to imagine him either raising his voice or yelling. When he made a mistake he'd just chuckle and say something like "Well that's not right..." and would either back up and find the mistake or just toss the paper he was working with and start over. He was patient, and methodical, and always had a warm greeting for the class. It was easy to tell that he wanted to teach[2].
I learned some really interesting things during that class. It was taught in the C programming language, so we learned the basics: structs, pointers, sorting algorithms, and linked lists. I definitely thrived in that class, and Sandy had a lot to do with that success.
Near the end of the semester, Professor Hill took a few minutes to give an overview of his graduate-level ECE660/661 Interactive Graphics Programming courses. He showed several amazing computer-rendered images and gave a 60-second overview of ray-tracing[3]. I was completely floored. Hooked. I had no viable path whatsoever to actually get into those classes, but I kept it in mind over the next few years wondering "How do I get in there?".
Fast forward to my 5th year at UMass. I was less than a year away from graduation, and as I began to test the job market I really didn't find anything that excited me. One extra-worrisome prospect was designing tubes for an air conditioning manufacturer in Connecticut. That sounded impressively uninspiring (it still does). Other prospects were companies like Pratt & Whitney (I could've used that engine design course after all) and some other DoD contractors.
So I did what any terrified undergrad does: I applied to the ECE Graduate School program at UMass.
I'll always believe that my application would have been denied if Sandy didn't intervene. I listed him as a reference, and my guess is they don't generally accept students with a near-zero level of prerequisite knowledge to that difficult program.
The most likely scenario is that the admissions committee was ready to toss my application, and then someone ran it by Sandy "Professor Hill, this kid listed you as a reference. He's not qualified for this program but we wanted to get your input." Sandy would have said something like "He'll be fine. Let him in."
My first semester was a rude awakening. I took a Digital Logic course, and before I could understand the graduate level homework, I'd open up the undergraduate textbook [literally] on top of the graduate textbook and then read enough to understand what needed to know just to get to the starting line of my homework.
That 1st semester, I took ECE660 and it was everything Sandy said it would be. We learned a broad array[4] of stuff, including a painstaking overview of the LZW algorithm for image compression and how to write a postscript document by hand. We began in 2D, with an orthographic projection of 3D mesh designs onto a 2D plane, and created a digital eye that we could "fly through" our 3D mesh world.
I'm fairly certain Sandy's favorite mesh was the buckyball. He had a particular enthusiasm when he introduced this object.
Incidentally, here's the list of project assignments for ECE 660:
I still have these projects, from 1994-1995. I've digitized several images and put them into galleries below.
The 661 class was when we got down to the serious business of writing a ray-tracer from scratch. This class was absolutely amazing, it terms of how much it taught me about graphics programming. Keep in mind that this was around the time when Pixar was best known for Luxo, the Lamp and the only computer-generated movies were very short (due to the fact that it took spectacular amounts of CPU time to render computer images back then).
We wrote some decently complex features, such as (a) mirrored surfaces (b) refraction (c) boolean objects (d) 2-D textures (checkerboard, ripple square, etc) and (e) 3-D textures (wood, marble, granite, etc).
It was around this time that I switched from programming on a Mac to using a PC[5]. The Mac (a Color Classic using the Think C compiler) was a very forgiving machine relative to the PC, which crashed early and often. Because I didn't have time to learn how to use the Borland C++ debugger, I had only two methods of debugging:
Neither of these was particularly efficient, and I still have a clear picture, when enumerating the pixels on the screen to render a ray-traced scene, if I wanted to see what was happening from the perspective of my digital eye on my screen, the following code:
for ( i=0; i<ROWS; i++ ) { for ( j=0; j<COLS; j++ ) { if ( i==DBG_ROW && j==DBG_COL ) { // print debug info // for this pixel } } }
Despite the extra work, I spent a fair amount of time with Sandy and looked forward to his class with unbridled enthusiasm twice each week.
I fell progressively further behind on the ray-tracing project as the spring semester wore on, and so during spring break, I had a rigorous routine I followed in an attempt to catch-up:
This went on seven days/week[6].
A big treat during this time was a potato burrito from La Vercruzana for dinner. I would load up on the toppings from the mini salad-bar they had, since the burrito itself was so expensive (priced at approximately $5.50), I tried to maximize the calories.
At the end of spring break, I had a stack of around 250 pages of 8"x11" printer paper with pencil computations on them. This stack represented all of the hand-rolled equations for the project up to that point (in my defense, I used the backs of other printouts and cover sheets from the engineering printer, so it wasn't like I needed a new supply of paper).
I still have printed copies of all of my source code for all of these classes. I also have my final, graded, ray-tracing project cover sheet.
Here's the cover sheet, which provides a little window into the technology zeitgeist circa 1995 (my monitor was only 256 colors with a resolution of 800x600):
Below is a gallery of mixed images from the ray-tracing project. The 3.5" floppy diskettes that I still have do not have any images on them, so those 256-color GIFs are likely lost to the sands of time.
Amazingly enough, Sandy became my graduate school advisor. One of my favorite semesters of graduate school was a 3-credit independent study. It was an in-depth study in object-oriented programming. My project was to write a library that could be used to create a simple 2-D drawing program on a Mac (think: lines, rectangles, ellipses, etc, with the ability to select them for scale and rotation, plus the ability to group them hierarchically and move them around).
The thing I liked most about this project was the amount of trust Sandy had in me. We only met a couple of times during the semester (and those meetings were quite brief), and then once at the very end of the semester so I could give him a quick overview. I really enjoyed working independently (which is true even today).
It was around that time that I can say I became friends with Sandy. I was invited to his house a handful of times for dinner & wine, which was when I got to know Merilee, who was always warm and inviting.
My favorite times with Sandy were when we able to "geek out" on the latest advances in computer graphics. He was incredibly curious, and we would talk about C++, object-oriented programming, the latest advances in hardware, and projects that were coming out from other universities.
After I left UMass, I moved to Seattle to join a small technology company called Starwave. While I did get back to Amherst from time to time, these trips began to get more infrequent over the years.
For many years after I left UMass, I would send Sandy an email with the latest siggraph videos. Nobody ever understood my amazement when video games started rendering millions of polygons per second in real time, but Sandy knew exactly how cool that was. There were also a fair number of "fluid visualization" videos, plus some pseudo-random visualizations like smoke, or sand, or hair.
During my last trip to Amherst, I remember walking around downtown and it looked like a ghost town to me. There wasn't a single face I recognized (and the college kids looked so young). Plus, the center has gentrified a bit over the years and now there are even a couple of fancy-ish restaurants and a nice brew pub in Amherst center[7].
I was invited to his retirement party in Amherst and mustered up the courage to let everyone know what a huge influence he had on me, and how meeting him and taking his ECE242 class changed my career trajectory, and ultimately changed my life (a sentiment met with a collection sigh of "Awww...." from the people in attendance).
I also had a chance to give a short speech on the campus of UMass as part of an alumni award I received in 2013. During my time in Amherst, I stayed with Sandy and Merilee and have a chance for an extended catch-up, as I escorted Sandy to the campus center for the ceremony. For those of you who missed it, here's the video of the ceremony. It's 136MB in size and 11 minutes in duration.
Sandy and Merilee made one trip to Seattle in 2007. I do have a handful of photos from that time.
I feel like I owe him a debt of gratitude, for showing me a different way to be. When I met Sandy I had found a sort of compass, or north star, showing me a new path. Here was a guy who was a scholar and a gentleman, who was kind, thoughtful, and gentle, and who happily took time to listen, and help, and to just generally make everything better.
He was one of the most influential people in my life and I really miss him.