CSE 374, Programming Concepts and Tools
Information and Syllabus, Winter 2014

Logistics and Contact Information: Instructor: Laura Campbell, CSE 350, campbell(at)cs. See www.cs.washington.edu/374/ for all information about the course including lectures, assignments, TAs, office hours, and so forth.

Communications: A discussion board is linked to the course home page so we can keep in touch outside of class meetings. Please participate. You will also automatically be subscribed to a class mailing list at your uwnetid address. This will primarily be used for announcements, clarifications, hints, and other notices from the course staff, and you are responsible for everything that is mailed there.

Messages to the course staff that are not appropriate for the discussion board can be sent to cse374-staff[at]cs. Please don't send email to individual staff members if possible. Messages sent to the entire staff are more likely to receive a timely response, and it helps ensure the staff gives consistent answers to questions, as well as get a better idea of whether several people have the same or similar questions.

Goals: Successful course participants will:

  • Gain a basic familiarity with the Linux operating system and toolchain.
  • Develop the skills to automate common computing tasks such as file manipulation and string processing
  • Internalize C-level programming and obtain beginning proficiency in C programming
  • Learn the basics of programming tools such as debuggers, profilers, compilation managers, and version control
  • Learn core software-engineering practices regarding specification and testing
  • Understand the basic issues and pitfalls of shared-memory concurrency
  • Learn how to acquire additional information and skills independently

Prerequisite: CSE 143 (i.e., intermediate programming in Java, including basic data structures like lists, queues, and binary search trees)

Grading and Exams:

  • 55% - Homework assignments, approximately weekly
  • 15% - Midterm exam, tentatively Monday, Feb. 10, in class
  • 25% - Final exam, Thursday, Mar. 20, 8:30-10:20
  • 5% - Class participation, citizenship, and other

In principal, all homeworks contribute equally to the 55%, but larger programming projects will be weighed somewhat more than others. Percentages are tentative and may be adjusted.

Extra Credit Policy:

  • Extra credit is designed to have little (but some) impact on your grade whether you do it or not. Not doing extra credit will not lower your grade -- regardless of how many other students attempt it.
  • Extra credit is designed to be challenging and an opportunity for people with extra time to work on something optional.
Therefore:
  • Expect an extra-credit problem to be worth much less than it should be based on how difficult it is. For example, if a homework is graded out of 100 points, the extra credit may be worth a maximum of 4 points with no chance for partial credit.
  • You should not attempt the extra credit until you have finished the rest of an assignment. We will ignore extra-credit work on assignments that are not at least "almost perfect" otherwise.

Late Policy: Deadlines will be given with each assignment. These deadlines are strict. It is exceedingly unlikely that skipping class or being late to class because of homework is in your interest. For the entire quarter, you may have four "late days". You are strongly advised to save them for emergencies. You may not use more than two for the same assignment. On group projects you may only use late days if all members of the group have them available, and all members of the group will be charged for each late day used. They must be used in 24-hour (integer) chunks. This policy may not be the same as in your other classes. You are responsible for understanding it if you choose to submit late work.

Academic Integrity: Any attempt to misrepresent the work you submit will be dealt with via the appropriate University mechanisms, and your instructor will make every attempt to ensure the harshest allowable penalty. The guidelines for this course and more information about academic integrity are in a separate document. You are responsible for knowing the information in that document.

Text: There are two books listed for the course. The Pocket Guide is "required" - it is a concise source of information and provides a useful reference to Linux at the level you need for CSE 374 (of course you should not feel responsible for memorizing all of the details in it). The Kernighan & Ritchie book is the classic reference on C from the people who invented the language. It is "optional", but has useful explanations and examples beyond the information presented in class or reference information available online.

  • Linux Pocket Guide by Daniel Barrett, O'Reilly, 2nd ed., 2012. If you have a copy of the first edition that will work just as well.
  • The C Programming Language by Brian Kernighan and Dennis Ritchie, Prentice-Hall, 2nd ed, 1988.

See the Linux and C resource pages on the course web site for links to additional information.

Advice: This course will expose you to a tremendous number of tools, concepts, and issues. Be warned:

  • The unease from using new tools may drain your energy because you will constantly learn new tools. Don't yield to the temptation to avoid learning new tools because it may seem "quicker" to finish assignments in other ways - that misses the whole point of the exercise.
  • The lectures will not teach the tools with enough detail to do the homework. Rather, they will give you the concepts behind the tools and enough information to point you in the right direction.
  • You will not master everything in 10 weeks, but you will learn enough to continue increasing your proficiency and more easily learn what you need in the future.
  • If you are spending an enormous amount of time on an assignment, you are likely missing a key concept. Spending more time "fighting through it" or randomly Googling for fragments to try is not effective; use yourself and the course staff to determine what you are missing.

Approximate Topics (subject to change): We will do almost all of the following, but not necessarily in this order.

  1. Files, processes, and shells (6 classes)
    1. Command-line utilities
    2. File editing
    3. Shell scripting
    4. String processing; regular expressions
    5. Web basics (http, html)
    Note: For consistency, we will all use Linux and bash. The concepts are similar for other operating systems and shells. We will use UW CSE Fedora Linux as our reference system in the few situations where it matters.

  2. C Programming (6-7 classes)
    1. Memory model
    2. Pointers
    3. Arrays
    4. Manual resource management
    5. The preprocessor
    6. Idioms for safe programming

  3. Programming tools (6 classes)
    1. Debuggers
    2. Profilers
    3. Linkers
    4. Compilation managers
    5. Version-control systems

  4. Software-engineering issues (2-3 classes)
    1. Multiperson programming
    2. Specification
    3. Testing
    4. Code-reuse patterns

  5. C++ (2-3 classes)
    1. C with classes and objects
    2. Other differences from C

  6. Concurrency (2-3 classes)
    1. Threads
    2. Races and deadlocks
    3. Locks and Transactions
    4. Message-passing