In that first semester of grad school, I suddenly realized that I had a lot of work to do to catch up to all these people with computer science bachelors degrees. I was a pretty good programmer for a physicist ("for a physicist" being the operative phrase) -- but the thing is, there is so much more to computer science than just programming. It was pretty tough going, but with help from friends and my very patient adviser, I eventually learned everything I needed to know to get that doctorate.
I was more on the math side of things than the programming or hardware side through my graduate career. (Thus the title of this blog, started in my final semester of graduate school.) I resisted learning any more of the technical side than I needed to, but I knew I needed to learn more. But I was scared -- it all seemed so complicated, and to admit that I didn't know something was a big risk -- what if I failed at learning it?
I took a research assistantship at the supercomputing center, which turned out to be the best thing I ever did careerwise. I got used to working with big supercomputers and started to feel a lot more comfortable programming in parallel. This allowed me to do the computing I needed to do for my dissertation, which could not have been done on anything smaller than a supercomputer. It was a risk I took that paid off many times over.
In my postdoc, I learned a lot more about programming and designing scalable parallel algorithms, which was awesome, but I was still kind of light on the hardware side when I started my current job. I had hoped to stay that way but quickly realized that I was on the side of things where I actually had some input into the design of the next-generation leadership supercomputer. (Okay, very little input, but more than I had ever had.) So instead of just not having an opinion, I had to actually start thinking about computer architecture and how it impacts the scalability of parallel algorithms.
But I really didn't know enough about computer architecture to have a particularly valid or useful opinion. So, when I was asked to help give a workshop on using our machines, I volunteered myself for the part where we explained the machine architecture. I then learned Computer Architecture 101 (courtesy of Wikipedia) and translated what I had learned into a presentation for a lay audience. This helped me to understand computer architecture in a way that I had never understood before. Suddenly all those discussions about next-generation machines made a lot more sense. And I could throw around computer hardware jargon with the best of them.
Today, I am pretty sure that I have no interest in designing computer hardware, but I am interested in how the components fit together and how this relates to algorithms for high-performance computing. I am really happy in my current job because I now have just enough knowledge of computer architecture to understand what is going on.