Advanced Programming Techniques
The peer review link is https://dropbox.cs.princeton.edu/COS333_S2017/peer
Thanks to everyone for a bunch of great demos; the standard keeps getting higher every year. Now all you have to do is submit, as described below...
IMPORTANT: Final submission information
Reminder: Laptop Policy: No laptops, phones or tablets except for taking notes and other class purposes.
Lecture notes: 2/7 2/9 2/14-16 2/21 2/23 (Eric Schmidt) 2/28 3/2 3/7 3/9 3/14 3/14, 3/16 3/16++ 3/28, 3/30 3/30 4/4 4/6 (Bjarne Stroustrup) 4/11 4/13 (Clay Bavor) 4/18 4/20 (Bonnie Eisenman) 4/25 4/27 (Christopher Moretti) 5/2 5/4
Assignments:   1 2 3 4 5
Project: preliminary description previous projects comments from previous projects project ideas from around campus design document information code for CAS authentication Project groups Demo information for May 8-10 Demo signup Demo advice from the last lecture part of a 333 demo in 2014 The Mother of All Demos: Wikipedia, YouTube Project groups and demo schedule Demo information for May 8-10
Readings: general bibliography language tutorials Literate Programming CRA report on CS Undergrad Enrollments
Office hours: [April 3: Office hours have been replaced by individual project group meetings.]
Dates: All dates are subject to minor changes.Su Mo Tu We Th Fr Sa Feb 1 2 3 4 5 6 7 8 9 10 11 first class 12 13 14 15 16 17 18 assignment 1 due 19 20 21 22 23 24 25 assignment 2 due 26 27 28 Mar 1 2 3 4 assignment 3 due 5 6 7 8 9 10 11 assignment 4 due; team meetings with bwk this week 12 13 14 15 16 17 18 19 20 21 22 23 24 25 spring break 26 27 28 29 30 31 assignment 5 due; weekly TA meetings start this week Apr 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 project prototype 16 17 18 19 20 21 22 23 24 25 26 27 28 29 alpha test 30 May 1 2 3 4 5 6 last class; beta test 7 8 9 10 11 12 13 demo days 14 15 16 17 18 19 20 projects due by midnight Sunday 21 22 23 24 25 26 27
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.
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, nor in any particular order.
- project overview; regular expressions, grep, shell
- scripting languages: Awk, Python, others
- web systems: HTTP, CGI, HTML, CSS
- web frameworks, development environments
- databases; network plumbing
- graphical user interfaces
- object-oriented programming, C++, STL
- component-based software: .NET
- APIs, design patterns
- etc. (maybe)
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 handful 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 posted. The books listed in this bibliography are also worth looking at; they cover a wide variety of material related to programming.
Tuesday and Thursday 11:00-12:20, Friend 101
Brian Kernighan, 311 CS, bwk at cs.princeton.edu.
Christopher Moretti 208 CS, cmoretti at cs.princeton.edu.
Gautam Sharma (gsharma)
Ghassen Jerfel (gjerfel)
Jonathan Balkind (jbalkind)
Nick Giannarakis (ng8)
Qizhe Cai (qizhec)
Sotiris Apostolakis (sa8)
Robin Qiu (yqiu)
Five programming exercises 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 35-40 percent of the course grade. Assignments will be posted on Tuesdays and due by midnight on the Friday of the following week. This leaves enough time that we will not be able to grant extensions except in case of documented medical or other serious issues. For the record, extracurricular activities and heavy workloads in other classes don't affect the lateness rules for this class.
If you submit your work late,we will give you credit for it on this scale:
- 95% for work submitted up to 3 hours late,
- 90% for work submitted up to 6 hours late,
- 85% for work submitted up to 12 hours late,
- 75% for work submitted up to 24 hours late,
- 50% for work submitted up to 48 hours late,
- 0% for work submitted more than 48 hours late.
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 your 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 all project requirements to pass the course. Furthermore, the class is so large that we don't have the resources to nag and make special arrangements; you are responsible for meeting all the requirements without reminders.
Attendance:Attendance and participation is potentially worth up to 10 percent of the course grade.
Regular class attendance is required and class participation helps. Unexcused absences are grounds for a failing grade regardless of other performance. This means you.
Please, no laptops, phones or tablets except for taking notes and other class purposes. Regrettably, computers and phones appear to be primarily used for email, Instagram, Snapchat, YouTube, Twitter, Google, solitaire, poker, eBay, Facebook, and similarly compelling diversions, all of which distract you, your neighbors, and me. (Additions to this list are welcome; I can't keep up.)
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, and unlike physics or math problem sets, there may be no single right answer. During your development, you are encouraged to ask your friends and the course staff about assignment ambiguities, language and operating system features, terminology, and so on. The course Piazza page is also useful for this. However, when the time comes to write the assignment-specific code that solves the problem, discussions with classmates are no longer appropriate. You may get help only from the course staff in the process of designing or writing code, not from other students.
Do not, under any circumstances, copy another person's program for an assignment, including any part of another person's program -- broadly defined to include operative code, comment outline, logic flow diagrams, pseudocode, etc.. This prohibition also includes any solutions from any previous offering of this course, any solutions to similar assignments from elsewhere, or any information gained from improper discussion or collaboration. Further, note that the University's academic regulations work in both direcitons: writing a solution for use by another person and using another person's work in any form both constitute violations. If you plan to do something that you are not absolutely sure is permitted, ask first. Ignorance of this policy will not be accepted as an excuse for your actions. See the academic regulations.
Examples of unacceptable behavior for assignments include:
- Copying any part of another person's program into your code. The only exception here is code given to you in the assignment directories or explicitly approved in the assignment.
- Working or collaborating with another student after either of you has started writing code.
- Consulting or using assignment solutions from any previous offering of this course.
- Helping another student to do any of the above.
The program you turn in must be your work. You may get help from the instructor or a TA after you have started writing code, but not from other students. Each student is expected to come up with his or her own individual solution.
You are responsible for ensuring that your files are not readable by your classmates. We recommend doing your COS 333 assignments on your own computer 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. If you help code or expertise that will help others do their projects better, you are encouraged to share it.