Princeton University
Computer Science Dept.

Computer Science 333:
Advanced Programming Techniques

Spring 2010

Brian Kernighan


Tue May 11 09:23:03 EDT 2010

If you're including Powerpoint, please send .ppt (Office 2003), not .pptx; some of us can't read the latter.

Now all that's left is to turn it in by 5pm Tuesday 5/11. Here's the final submission information.

And if you still have a borrowed book or equipment, please return it by Dean's Date as well. Thanks.

Lecture notes:    2/2    2/4    2/9    2/11-16    2/16-18    2/18    2/23    2/25    3/2    3/4    3/9    3/25    3/30    4/1    4/6-8    4/13    4/15    4/15-20    4/20    4/22    4/27    4/29   

Assignments:    1     2     3     4     5    

Project:    preliminary description (2/2)     previous projects (2/2)     comments from previous projects (2/2)     project ideas (updated 2/24)     Project information (2/11)     Design document template (2/19)     SVN notes (3/8)     CAS.tar for authentication(3/17)     Project groups and TA mapping (3/21)     Info on weekly meetings (3/21)     Rocket Surgery Made Easy (usability) (4/1)     Demo days info (4/7)     Demo Days schedule

Readings:    general bibliography     language tutorials     opinion piece on software tools     regular expression matcher (from Beautiful Code)     Perlis's Epigrams in Programming     Hoare's Hints on Programming Language Design and The Emperor's Old Clothes     Larry Wall's Let's go scripting     John Ousterhout on scripting languages     How SQLite is tested     SQL injection attacks     regular expressions (Russ Cox)     iPhone paper 1     iPhone paper 2     Whatever happened to programming? (Mike Taylor)     Harry Schmidt's web page     Bjarne Stroustrup's web page     Microsoft on Error Messages     Interface Hall of Shame     Google C++ style guide     McIlroy's Virology 101    

Old stuff:    Newsgroup     CS Dropbox     playlist     Survey results     TA office hours     Henning: API: Design Matters     Bloch: How to Design a Good API ...

Dates: All dates are subject to minor changes.

	 S  M Tu  W Th  F  S
Feb	    1  2  3  4  5  6	first class
	 7  8  9 10 11 12 13	assignment 1 due; preliminary project info
	14 15 16 17 18 19 20	assignment 2 due
	21 22 23 24 25 26 27	assignment 3 due
	28
Mar	    1  2  3  4  5  6	assignment 4 due
	 7  8  9 10 11 12 13	assignment 5 due; project design doc due
	14 15 16 17 18 19 20	spring break
	21 22 23 24 25 26 27	first TA meetings this week
	28 29 30 31
Apr	             1  2  3
	 4  5  6  7  8  9 10	project prototype
	11 12 13 14 15 16 17
	18 19 20 21 22 23 24	alpha test
	25 26 27 28 29 30	last class, beta test
May	                   1
	 2  3  4  5  6  7  8	project presentations
	 9 10 11 12 13 14 15	Dean's date; project due 5pm
	16 17 18 19 20 21 22
	23 24 25 26 27 28 29

Course Summary

This is a course about the practice of programming, an attempt to expose students to the development of real programs. Programming is more than just writing code. Programmers must also assess tradeoffs, choose among design alternatives, debug and test, improve performance, and maintain software written by themselves and others. At the same time, they must be concerned with compatibility, robustness, and reliability, while meeting specifications. Students will have the opportunity to develop these skills by working on their own code and in group projects.

During the first half of the semester, there will be a programming assignment each week, which should take perhaps 5-6 hours to complete. During the second half of the semester, students will work in groups of 3 to 5 on a project that will involve a substantial amount of design and implementation.

COS 333 is about programming, not about a specific language. The course will assume that you are familiar with C and Java, and will include excursions into C++ and scripting languages like shells, Awk, Perl, Python and Javascript. There will be significant emphasis on tools, both how to use them and how they are designed and built. Students must be comfortable with C and Java programming and with Unix, and able to write modest-sized programs that work. COS 217 and 226 are prerequisites; you might take 333 while taking COS 226 but it's not a good idea unless you're a very decent programmer.

Syllabus:

This syllabus is always subject to change. Each topic will take roughly one week; there's no guarantee that we will cover all of them.

This is meant to be more than a laundry list, however. Each section will also discuss issues of design, implementation, testing, performance, portability, and other software engineering concerns, and these will also be part of the programming assignments. With luck there will be a couple of guest lecturers as well.

There is one required text: The Practice of Programming, by Kernighan and Pike; you should also know basic Unix tools and usage as described in, for example, The Unix Programming Environment. Other readings will be handed out in class or found on the Web. The books listed in this bibliography are also worth looking at; they cover a wide variety of material related to programming.

Lectures:
Tuesday and Thursday 11:00-12:20, Friend 006

Professor:
Brian Kernighan, 311 CS Building, 609-258-2089, bwk at cs.princeton.edu. Depending on class size, I may set up regular office hours once things get rolling; alternatively, send mail to make an appointment, or just drop in if my door is open, which it usually is.

Teaching Assistants:
     Mat Arye (arye) Monday 12:30-1:30 CS 103B
     Tom Jablin (tjablin) Wednesday 2:00-3:00 CS 213
     Nick Johnson (npjohnso) Tuesday 4:30-5:30 CS 213

Assignments:

Five programming assigments will be assigned during the first half of the term; each is intended to take about 5-6 hours, but is sure to take longer unless you are careful.

Assignments are together worth about 30-35 percent of the course grade. Assignments are due by midnight on Fridays unless there are extraordinary circumstances. For the record, extracurricular activities and heavy workloads in other classes don't count as "extraordinary", no matter how unexpected or important or time-consuming. Assignments will generally be posted on Tuesday and due at midnight on Friday 10 days later. This leaves enough time that I will be unsympathetic to requests for extensions.

Project:

The second half of the semester will be devoted to a group project. The project can be done with whatever combination of languages and techniques makes most sense; one of the goals of the project is to encourage careful tradeoffs among alternatives, and planning of interfaces to minimize dependencies among components. The project is a good place to explore personal interests further than can reasonably be covered in class.

The project will have frequent checkpoints along the way for which you will have to prepare status reports, preliminary designs, and the like. There will be a public presentation and demo at the end, a written writeup, and submission of a system for testing and evaluation. All of these are graded.

The project will be worth about 60-65 percent of the course grade; it will be shared equally among group members, with the possibility of negative adjustments for members who fail to contribute their fair share.

You must complete all assignments and project requirements to pass the course.

Attendance:

Attendance and participation is potentially worth up to 10 percent of the course grade.

Regular class attendance is required and class participation helps. Frequent absences are grounds for a failing grade regardless of other performance. This means you.

Collaboration Policy for Assignments:

(This policy on collaboration in assignments is adapted from the COS 217 web page.) Programming, like composition, is an individual creative process. Individuals must reach their own understanding of the problem and discover a path to its solution. During this time, discussions with friends are encouraged. However, when the time comes to write the code that solves the problem, such discussions are no longer appropriate -- the program must be your own work (although you may ask teaching assistants for help in debugging). If you have a question about how to use some language or operating system feature, you can certainly ask your friends or the teaching assistants. The course newsgroup is also intended for sharing insights on the meaning of questions, terminology, and so on.

Do not, under any circumstances, copy another person's program for an assignment. Writing code for use by another person or using another person's code in any form violates the University's academic regulations.

Examples of unacceptable behavior for assignments include:

The program you turn in must be your work. You may get help from the instructor or TA after you have started writing code, but not from other students. Computer science assignments are not like physics or math problem sets: there is no single right answer. Each student is expected to come up with his or her own individual solution.

If you plan to do something that you are not absolutely sure is legal, ask first. Ignorance of this policy will not be accepted as an excuse for your actions.

You are responsible for ensuring that your files are not readable by your classmates. We recommend doing your COS 333 assignments on your own machine or in a private subdirectory, i.e.:

	% mkdir cos333
	% chmod 700 cos333

Collaboration Policy for Projects:

Projects will often use open source code and other publicly available material as building blocks or as the basis for modification and adaptation. This is permitted and indeed encouraged, but such code must be properly attributed, and the project as a whole must be substantially your own work. Please consult with the instructor if you are uncertain about a proposed course of action.

Project groups are encouraged to share insights and information about how things work, how to get things done, and other aspects of programming knowledge.