Résumé

You can find a (not so) recent one page technical résumé here and my LinkedIn page here.

Other projects that didn't make the cut include teaching undergraduate and graduate courses at the University of Pennsylvania and some software I developed while at school.

My teaching experience at the University of Pennsylvania comes from being  a Head TA on CIS320: Introduction to Algorithms, with Prof. Sanjeev Khanna during Spring 2014 and CIS505: Software Systems (Fundamentals of Distributed Systems), with Prof. Matt Blaze during Spring 2013. There I led teams of up to 6 Teaching Assistants to manage classes of up to 193 students, I administered the class back-end, setting up homework submissions on headless UNIX servers, SSH keys and plagiarism detection, I developed Bash scripts for automated software grading, roster management and grade mailing, I designed plenty of homework problems and exams for CIS320, and finally, I supported students extensively (63% and 80% of instructors' responses on Piazza, respectively). I was also a TA on CIS121: Introduction to Data Structures and Algorithms with Prof. Kostas Daniilidis during Fall 2012, where I taught weekly recitations to a class of 7 and lectured occasionally a class of 105 students (e.g., see the midterm review session I designed and presented), among others. I was evaluated by students with 3.5 out of 4 on overall quality as an instructor; compare to an average of 2.81 for the rest of the team.

Finally, I've done some cool C programming projects for classes, like a Unix shell, an interpreter for a first-order functional language, a multi-threaded music streaming server over HTTP, and a compiler for a procedural language, which also included a custom-written Assembly x86 library of standard I/O functions. I've also designed and developed a full-scale distributed chat system over UDP (see attached picture for a screenshot!). This consists of seven threadpools, where each threadpool is responsible for a specific functionality, and threads between different pools communicate with each other through priority queues. Briefly, the functionalities implemented by the pools are: check for alive peers, conduct elections and implement the bully algorithm, exchange coordination messages reliably with another peer over UDP using ACKs and exponential time-outs, transmit chat messages to other peers (FIFO fully-ordered multicast). It also features a super cute ncurses text-based user interface.