Programming Experience Requirement
Ph.D. students must have or acquire experience in computer programming with a general purpose programming language. Before their candidacy exam students must demonstrate that they have designed and implemented some substantial software system, either from scratch or as a significant extension to existing software.
The student must be responsible for the design of the software or the extension. The software does not have to be "industrial strength", i.e., it does not have to be polished to the point where it is ready to be released to a user community. A simple demonstration of some algorithm or idea is sufficient. However, the problem should be large enough that significant systems engineering issues are addressed. Some examples are given below.
This requirement can be satisfied through a summer programming job, programming experience as an undergraduate, or by independently writing software, provided that the above criteria are satisfied.
TTIC has appointed a member of the faculty as "Programming Experience Czar". Students should consult with this faculty member to make sure that whatever project they embark on or have embarked on is substantial enough to provide actual "programming experience".
By the time of their candidacy exam, students must have submitted their code together with a paper (10-15 pages in, e.g., standard LaTeX 10pt, single-column article style) explaining the problem, known approaches to solving it, and the actual approach taken. The write up must also contain a discussion of key aspects of the actual code and technical difficulties that were encountered together with their solutions. If the project consists of an evaluation of an algorithm or an implementation technique, then the paper should report quantitative results. Finally, students must give a presentation on their project before faculty and other students.
Examples:
- Writing an interpreter or a simple compiler for a domain specific language of the student's design.
- Adding features to an existing programming language that require significant re-engineering of the corresponding compiler or interpreter.
- Writing a symbolic algebra system.
- Writing a numerical optimization package.
- Writing a machine learning toolkit.
- Writing and experimenting with a network simulator.
- Writing a simulator for a strategic game or an automatic player for such a game.
- Writing a web crawler for information retrieval.
