Meet the Faculty - Gopalan Nadathur
Tell us about your journey to the University of Minnesota. How did you become interested in computer science and your specific field?
When I got into computer science, it didn’t really exist as a discipline. I got an undergraduate degree in electrical engineering. Engineering and related employment didn’t seem to be my cup of tea, so I went to graduate school because I heard there was something like computer science. Where I went to study, it was called automation, and it covered systems science and computer science, the latter in a fledgling fashion.
I came to the U.S. to pursue a PhD at the University of Pennsylvania. At the beginning, I thought I would develop a thesis with a very ambitious goal. That goal was to develop the ability to think about knowledge and belief within reasoning and computer systems. I spent several years working on this topic. However, I discovered the tools did not exist at that time to successfully build such reasoning capabilities into an agent. I then shifted my perspective to work on something more manageable for a PhD thesis — logic and programming languages.
After my PhD, I worked at Duke University and the University of Chicago until 2000, when I moved to the University of Minnesota. My wife is a molecular biologist, and she was offered a faculty position here. That was what made me look at the University of Minnesota initially. However, I liked the work environment I saw here, which, at that time, was that of a friendly group of people with the right perspective on what research is about. That convinced me to come here. Over the years, I’ve enjoyed my decision.
Tell us more about your current research.
My research is related to logic and programming languages. When you build a programming language, you do it to serve two purposes. One is to allow us to articulate thoughts, frame the problems properly, and so on, in a way that eventually ends in a computational solution to the problem. The other aspect is that we want confidence that the program is going to solve the problem we want it to solve. These two things are referred to as expressivity and verifiability. This principle applies to a lot of other things; it is fundamental to building reliable computer systems.
Much of my work in the last several years has been in these two realms. I’ve been determining and designing specification languages tailored to particular application areas. The other part is that once I have the specification language, I design logic that is needed to reason about the specification language.
Which courses do you typically teach? What can people expect to get out of those courses?
I teach CSCI 2041 - Advanced Programming Principles. The first thing students learn when they come into computer science is how to write programs. But when they are trying to familiarize themselves with the process of writing programs, they’re just doing it. An important focus in computer science is not only doing things, but also understanding the principles that are underlying how we should do them. This course takes that step and exposes students to different ways of thinking about the programs that they want to write or have written.
I also teach CSCI 5106 - Programming Languages, which I will be teaching this fall. It looks at how formalism impacts the way you solve problems. Students are exposed to the differences and particular features of different kinds of programming languages. They also start to think about designing new languages for solving specific problems.
Another course I teach is CSCI 4011 - Computability Theory. This course exposes students to what the limitations of computers are. There are some things that computers just cannot do and we spend time trying to understand these limitations. Another aspect of the course is understanding what you can do with limited amounts of time and space.
I teach CSCI 5161 - Introduction to Compilers as well. We want to program in a high-level language because if we write programs in machine code, we can’t get very far: we wouldn’t be able to write programs that solve the immense kinds of problems we are solving these days without high-level languages. However, before programs in these languages can be run, they have to be translated into something the computer understands. This course provides a glimpse of how such a translation process can be structured.
What do you do outside of the classroom for fun?
For fun, I like to read things about history and political issues. I have also been involved for many years at the University with issues related to academic freedom. I enjoy sports. I have an ambition to master cross-country skiing, something I have not been very successful in achieving, and like to get out onto the squash court every now and then.
Do you have a favorite spot on campus or in the Twin Cities?
I like parks. One of my favorites is Central Park in Roseville. I am also pretty fond of the Guthrie Theater.
Is there anything else you would like students to know?
They should know that I am a friendly guy, especially to students. So, if you’re curious about programming languages or logic or, more generally, what our educational process should be about, send me a message or stop by. We can talk about these things and share perspectives.