I am an assistant professor of computer science at St. Lawrence University. My research expertise is in the intersection of computer architecture, programming languages, and software engineering where I develop programming support for emerging hardware technologies. Additionally, I teach a breadth of computer science courses, but generally focus on more systems-oriented courses.
In 2020, I received my Ph.D. in Computer Science and Engineering from the University of Michigan. My advisor was Westley Weimer. In 2016, I received a Master of Computer Science (MCS) from the University of Virginia. My co-advisors were Westley Weimer and Kevin Skadron. In 2014, I received a B.S. in Computer Science, Mathematics, and German Studies from St. Lawrence University. My academic advisors at St. Lawrence were Ed Harcourt (CS), Dan Look (Math), and Ingrid Stipa (German Studies).
In my spare time, I enjoy (among other things) cooking, hiking, 3D printing and modeling, electronics, knitting, playing woodwind instruments, photography, and reading.
Previously, I was Ph.D. candidate in Computer Science and Engineering at the University of Michigan. I was also an Engineering Teaching Consultant for the Center for Research and Learning on Teaching in Engineering at the University of Michigan. Prior to this, I was a Ph.D. student in the Department of Computer Science at the University of Virginia and an Olive B. and Franklin C. Mac Krell Fellow at the Jefferson Scholars Foundation.
I am also the primary caretaker of the CS Grad Job and Interview Guide, a collaborative effort to describe the process for applying for [primarily academic] jobs after completing a PhD. Questions and contributions are always welcome!
While an undergraduate at St. Lawrence University, I taught a total of eleven discussion sections for German Language (DaF) courses. Read More
A selection of my teaching resources may be found here.
Curricula (including materials and selection of topics and activities) for the German Labs were developed by myself to coordinate with the schedule of topics in lectures. An example syllabus is available here.
Broadly, my personal research interests fall in the intersection computer architecture programming languages, and software engineering. I enjoy using my computing knowledge to help solve the world's problems, and thus it's not uncommon for me to work on projects outside of my nominal areas of expertise (especially with motivated students).
My primary research interest is in the development of suitable abstractions, languages, and tools for new and emerging technologies as well as the design of new hardware architectures to address present-day challenges. In particular, I have studied the application of deterministic- and non-deterministic finite automata (DFAs and NFAs) an push-down automata (PDAs) as a hardware abstraction layer for accelerators.
Collected data is often analyzed in a multitude of different ways, and many algorithms in areas such as data-mining, bioinformatics, deep packet analysis, and spam filtering require identification of exact or near-match character patterns. Special hardware accelerators, such as FPGAs and custom hardware (e.g., Micron's Automata Processor, the Cache Automaton, etc.) can dramatically reduce processing time for these tasks. Because of pressure from industry, physical design limits, and the rapid growth of data collection, these devices are becoming increasingly common in general-purpose computing; however, these technologies often rely on abstractions or assumptions not supported by present techniques for programming, debugging, and securing systems. Thus, programming these devices can be challenging for non-expert users. My goal is to ease the programming burden by providing automated transformations, new language support, and debugging tools, which enable researchers to leverage these performance improvements.
Autonomous vehicles, such as quadcopters and rovers, perform critical tasks for government agencies and emergency services. Missions often take place in locations where communication with human operators is infrequent or delayed, such as distant planets, war zones, and remote crash sites. Consequently, humans may not be able to take manual control to recover the vehicle if the software begins to malfunction. Many of these malfunctions, or software bugs, do not cause total loss of the vehicle, but rather hinder the successful completion of a mission (e.g., a sample is not collected or a camera is not pointed in the correct direction). How can an autonomous vehicle fend for itself when such malfunctions occur?
To help solve this problem, I collaborate with a team of academics and industry practitioners to combine best-in-breed techniques for securing software, detecting attacks, and automatically repairing bugs in source code. While detecting problems in real-time and repairing software are challenging in and of themselves, deploying new software mid-flight (and avoiding crashes) presents an additional set of challenges. My colleagues and I have been developing a dual controller hardware design that includes fail-over hardware for situations when the main controller is compromised. Additionally, we have developed selective checkpoint and restore algorithms to maintain critical mission state while loading new software.
Our contributions aim to increase system resiliency for autonomous vehicles, allowing more missions to complete successfully in the face of software defects and malicious attacks.
I have developed several tutorials for configuring quadcopter software and hardware. Please see below for links to publicly-available documentation.
I work with Robin Lock, Patti Frazer Lock, Ed Harcourt, and our students to develop a collection of web-based statistical simulation apps. The application, known as StatKey, accompany Statistics: Unlocking the Power of Data.
As of March 1, 2019, StatKey has had over one million users around the world (according to Google analytics).
While attending St. Lawrence University, I worked along with my faculty advisor, Ed Harcourt, to complete a year-long senior honors research project, entitled Accelerating Database Joins Using a General Purpose GPU. For this project, I implemented an experimental database engine in CUDA that supports relational joins between tables.