Ph.D. student in Computer Science at Brown University who sometimes writes.
I'm passionate about expanding and leveraging Rust's language features to improve the safety and ergonomics of programming in Rust. I've implemented one language RFC, authored another, maintain a popular library, and delivered ergonomic and safety contributions to many other libraries. I'm currently working on making bit-reinterpretion casts memory-safe.
I developed Pyret's best-in-class error messages, its language-level support for tabular data, an autograding system that runs on a supercomputing cluster, and an IDE that helps students develop great tests before they begin their implementation work!
I run the Inning Club, a guerilla archival collective devoted to preserving that which Brown University's staff archivists miss. Since 2013, the Club has dissected Brown's secret societies, interviewed countless alumni, and has accumulated more than 5,000 photographs (spanning decades!) of students crawling through Brown's tunnels and peering out from its roofs.
In 2016, I published Liber Brunoniana, a 21st-century remix of Brown University's authoritative dead-tree encyclopedia.
In 2020, I rescued six years of student activities documentation from destruction just before Brown University shut down its online student activities management system. I'm now working with the Brown Digital Repository to make my high-fidelity archive available to future researchers. (Huge kudos to the WebRecorder project!)
In the Spring of 2018, I had just finished a paper and my advisor was out of the country for a week—what's a bored CS PhD student to do? Hack up an electric organ, of course!
Vox Solaris is a MIDI electric organ constructed from the PC motherboard speakers of the ~80
pipes desktop computers in Brown's Sun Lab. I developed an ALSA MIDI driver for
beeping the motherboard speaker, a utility for blasting MIDI notes over a network, and a MIDI demultiplexer for distributing the keyboard's polyphonic output into monophonic streams for each computer. Our department's technologist-and-pianist extraordinaire Ben Nacar gave a live performance on it!
Besides my academic publications (see below), I maintain a blog, and previously had a column in the Brown Daily Herald. Between the two, I've written about Rust tricks, practical data science, privacy, local history, and preservation. My work on privacy and surveillance was the subject of local news coverage.
- Executable Examples: Empowering Students to Hone Their Problem Comprehension (2022)
Draft. Further updates will be made.
- Shriram Krishnamurthi
- Kathi Fisler, Mark Guzdial, Tim Nelson, Joe Politz
Students often tackle programming problems with a flawed understanding of what the problem is asking. Some pedagogies attempt to address this by encouraging students to develop examples in the form of input–output assertions (henceforth "functional examples"), independent of (and typically prior to) developing and testing their implementations. However, without an implementation to run examples against, examples are impotent and do not provide feedback. Consequently, students may be inclined to begin their implementations prematurely—a process whose comparatively ample feedback may mask underlying misunderstandings and instill a false sense of progress.
In this dissertation, I demonstrate that providing students with timely feedback on their functional examples incentivizes them to develop functional examples, improves the quality of their test cases, and may improve the correctness of their implementations.
- Using Relational Problems to Teach Property-Based Testing (2021)
Editors’ Choice Award
- Tim Nelson, Shriram Krishnamurthi
The success of QuickCheck has led to the development of property-based testing (PBT) libraries for many languages and the process is getting increasing attention. However, unlike regular testing, PBT is not widespread in collegiate curricula. We find that the use of “relational” problems — those for which an input may admit multiple valid outputs — easily motivates the use of PBT. We also notice that such problems are readily available in the computer science pantheon of problems (e.g., many graph and sorting algorithms).
- Will Students Write Tests Early Without Coercion? (2020)
- Shriram Krishnamurthi
Students faced with a programming task often begin their implementation without a sufficient understanding of the problem. Several prior papers suggest that formulating input–output examples before beginning one’s implementation is the key to averting problem misunderstandings, but that students are loath to actually do it. Is outright coercion instructors’ only hope to convince students to follow this methodology and hence help themselves?
We conjecture that students’ reluctance may stem from the disaffordances of their programming environments. In this work, we augment the student’s programming environment to encourage examples-first development, and design a novel measure to assess students’ adherence to this methodology. We apply these measures to students using our modified environment in a semester-long course, and find high voluntary adherence, especially relative to the literature’s low expectations.
- Executable Examples for Programming Problem Comprehension (2019)
- Shriram Krishnamurthi
Flawed problem comprehension leads students to produce flawed implementations. However, testing alone is inadequate for checking comprehension: if a student develops both their tests and implementation with the same misunderstanding, running their tests against their implementation will not reveal the issue. As a solution, some pedagogies encourage the creation of input–output examples independent of testing—but seldom provide students with any mechanism to check that their examples are correct and thorough.
We propose a mechanism that provides students with instant feedback on their examples, independent of their implementation progress. We assess the impact of such an interface on an introductory programming course and find several positive impacts, some more neutral outcomes, and no identified negative effects.
- Who Tests the Testers? (2018)
- Shriram Krishnamurthi, Kathi Fisler
- Instructors routinely use automated assessment methods to evaluate the semantic qualities of student implementations and, sometimes, test suites. In this work, we distill a variety of automated assessment methods in the literature down to a pair of assessment models. We identify pathological assessment outcomes in each model that point to underlying methodological flaws. These theoretical flaws broadly threaten the validity of the techniques, and we actually observe them in multiple assignments of an introductory programming course. We propose adjustments that remedy these flaws and then demonstrate, on these same assignments, that our interventions improve the accuracy of assessment. We believe that with these adjustments, instructors can greatly improve the accuracy of automated assessment.
- Error Messages Are Classifiers (2017)
- Shriram Krishnamurthi
- Paper Talk
- We take the perspective that error reports are really classifiers of program information. They should therefore be subjected to the same measures as other classifiers (e.g., precision and recall). We formalize this perspective as a process for assessing error reports, describe our application of this process to Pyret, and present a preliminary study on the utility of the resulting error reports.
- Set a type's minimum alignment with const generics.
- Transmute memory fearlessly. A prototype of language-level safe transmutation in Rust.
- Shell utility for conditional redirection.
- Beep the PC motherboard speaker.
- Use the PC motherboard speaker as a monophonic MIDI synthesizer.
- Volume-aware splitting of a polyphonic MIDI stream into multiple, monophonic streams.
- Fire MIDI events across the network.
- A no-nonsense command-line graphing utility written in Rust.
- Liber Brunoniana
- Using NLP to breath new life into old encyclopedias.
- An infinite whiteboard for stylus+touch devices written in Rust.
- Iterator adaptors, iterator methods, free functions, and macros for Rust iterators.
- Pyret Programming Language
- A programming language designed by computer science educators, for computer science education. I lead the initial design and implementation work of Pyret's language-level support for tabular data, and designed most of Pyret's error messages.
- Pyret IDE
- I implemented support for rich, hypertext error messages.
- Linear algebra library for the Rust programming language. Contributed numerous improvements to ergonomics and memory safety.
- Added implementation of arbitrary_enum_discriminants RFC.
- Utilities for zero-copy parsing and serialization. Fixed unecessarily restrictive soudness limitations.
- A Vec alternative backed by an array, using const generics. Improved panic recovery.
- Compile-time dimensional analysis for Rust. Fixed typo in type name.
- Efficient numeric trait implementations on arrays. Fixed breaking change fallout.
- MIDI parsing library for Rust. Added various trait implementations.
- Generic type-level programming for Rust. Improved package metadata.
- Rust implementation of the Walker-Vose alias method. Added iterator interface.
- Count lines of code quickly. Added Pyret support.
- A Go-based static site generator that compiles brandur.org. Fixed spacing issue.
- A Hacker News extension. Fixed comment count.
- Hello world in every computer language. Added Pyret.