Class of 2017
Coursework: Systems Programming, Operating Systems, Digital Platforms, Design of Usable Interactve Systems, Intro Electrical Engineering, Performance Engineering of Software Systems (MIT), Data Structures and Algorithms, Systems Security, Computer Vision, Machine Learning, Corporate Financial Accounting (MIT), Intro to Distributed Computing
Taught section of class, graded homeworks, and held office hours
Held office hours and graded homeworks and tests for Programming Languages and Translators, comprised of mostly graduate students
Research in compiling functional intermediate representations to hardware in collaboration with Professor Stephen Edwards, culminating in "Compiling Away Recursion for Hardware."
Lectured and graded college students for Software Analysis and Design I
Founder and CEO
Designed and implemented Eclipse plugins to unify the development build system into Grunt.
Efficiently led the port of a large CoffeeScript codebase to TypeScript by designing and implementing automated tools to do the majority of the rote labor, then led the team on the remaining edge cases where nuanced understanding of the intent of the code was required because of semantics mismatches between the languages when used idiomatically. In particular, adapted the CoffeeScript compiler to emit TypeScript. Also created interactive seating chart web app for hack week.
Built JIT compiler for SQL-like filter engine for low-latency PubSub system
with research advisor Professor Stephen Edwards
To provide a superior way of coding, compiling, and optimizing parallel algorithms, we are developing techniques for synthesizing hardware from functional specifications. Recursion, fundamental to functional languages, does not translate naturally to hardware, but tail recursion is iteration and easily implemented as a finite-state machine. In this paper, we show how to translate general recursion into tail recursion with an explicit stack that can be implemented in hardware. We give examples, describe the algorithm, and argue for its correctness. We also present experimental results that demonstrate the method is effective.
We aim to compile and optimize any Python code faithfully. To do this, we make one critical assumption: that we can assume that we have the entire code, and that no new code can be loaded at runtime. Without this assumption, we could optimize very little as runtime-loaded code could modify the program in ways which the compiler would need to prove impossible in order to make certain optimizations. With this assumption, we can use whole code analysis to prove facts about the source code which allow us to perform certain overhead-removing optimizations. Thus, we hope to compile most common-case Python code to native C++ mechanisms for maximal performance, and leverage CPython as a fallback to maintain semantic equivalency with CPython. Currently, P3 yields a 2.7x speedup over CPython.
Project for Programming Languages and Translators
Revenge-of-the-table is a language designed to ease the use and manipulation of relational databases by allowing the programmer to view them in the object-oriented paradigm. This is accomplished by compiling La Mesa code into Java code, with the appropriate SQL API calls, that will automatically translate object-oriented data structures into tables that can be stored in the database. Similarly, the language will be able to query the database in a more natural way by allowing programmers to search for objects that meet certain criteria rather than manually querying across numerous tables to find a desired data point. This will allow programmers to forget the implementation details for storing their data in a relational database and permit them to focus on doing interesting things with the data.
Ast-pp generates code for printing types defined in that OCaml file. In Haskell, the type system permits a polymorphic function for converting objects to strings. However in OCaml, this is not possible. OCaml should, in my opinion, provide some built in facility, whether through automatic code generation or language-level mechanism, to print data structures, as this is essential for debugging programs. Ast-pp remedies this omission by generating the code programmers would otherwise spend time writing to print data structures. I wrote it to accelerate my work on revenge-of-the-table.
In Objective-C, you can only call an overridden implementation of a method from an immediate subclass of that method's class. This works well to provide encapsulation, and based on the way super is handled, a super method implementation cannot be called from any but the immediate superclass (inheritance notwithstanding). This is a good thing, as it would break large bits of encapsulation if subclasses could call arbitrary super implementations, or worse, if other objects could call super implementations of methods on foreign objects.
In C, and thus Objective-C, a switch statement only works with integers, and the case labels all need to be constant. Strings seem like a natural thing to switch on, especially for command line interfaces. Unfortunately, they cannot be reduced to integer constants, so we cannot use them. Now that we have blocks in the language, we can create a dictionary where we associate any object, such as an NSString, with a block, and call the selected block after a simple dictionary lookup.
My project for Advanced Software Engineering at Columbia. PurplePoster is a web application for sharing the (often purple) posters around New York that indicate something is filming on a particular corner on a particular day. The mobile-optimized site leverages smartphones' GPS to make submitting a poster as easy as filling out the name of the project and the day it's filming on. Users can then share the filming information on facebook or twitter. Users can also set up email alerts for particular movies, actors, or neighborhoods.
BetterBoard is a Blackboard competitor that grew out of the usability and design failures of Blackboard. Posting a new assignment is absurdly complicated in Blackboard, as is receiving and grading assignments. Blackboard uses an over-engineered system of folders for posts, which is nothing but confusing for students and teachers alike. BetterBoard was made to be the opposite of Blackboard: highly usable through a radically simplified design. It takes only two clicks to post new assignments for teachers, and no clicks for students to see all of their homework in one place.
Type in the box on the left, and it shows up in pictures in the right. Pictacom uses the Bing image search API to search the web for the best picture for a given word, then replaces it in the text. Try it out!
Officially, iPhone and iPad apps can only be made on a Mac. I wanted to program my iPad from my iPad, so I made this app. It can run Objective-C-like code and interact with the iOS's Cocoa framework through an interpreter I wrote for the app. I made this before I took compilers, so I had to derive my own parser and interpreter in Objective-C.
Notecards keeps track of tidbits of information, and their source. Notes can be dictated to from an iPhone through Siri, so you never have to take your hands off of that great source. You can see an overview of your notes and while read the entirety of one, much like the interface on Apple's Mail.app on the Mac.
With one tap, a new Spanish word comes up, and with another, the English translation appears below it. I made this app to as an early demonstration on programming to Devclub.
A game like Monopoly, this interpretation of The Great Gatsby for an 11th grade English class takes place over an iPad and several iPhones. The board and current state of the game is displayed on the iPad, while each player's iPhone shows the items and money they have in the game. The board on the iPad is a multi-touch, interactive map.
In the game, The Odyssey is partially read by the computer, and partially controlled by you, the player. You type in to the game what you want Telemachus or Odysseus to say, think, or do, and the narrative continues as if they had done so. Although the artistic goal of the project was to show that in the Odyssey, the characters have no free will, and thus end up in the same situation at the end of each book regardless of their choices, your different choices make the story progress in different ways.
Like 20 Questions, Infinite Questions asks a series of yes or no questions to the player about something they're thinking of so it can guess what it is. Unlike 20 Questions, when the player outsmarts the computer, the game learns from its loss.