This is a course about the practice of programming, which is more than just writing code, and software engineering, which is more than just programming. Professionals in the field must also assess tradeoffs, choose among design alternatives, debug and test, measure and improve performance, and maintain software written by themselves and others. They must be concerned with compatibility, robustness, and reliability, while unfailingly meeting specifications.
There will be five programming assignments in the first six weeks of the semester. These assignments will be completed individually. Each will consist of implementing a specification and developing a testing apparatus to provide evidence that the implementation matches the specification. During the second half of the semester, students will work in groups of three to five on a largely-unconstrained design project of their choosing to complete a three-tier system addressing a real-world application.
The practice of programming is not constrained to a specific language, and neither is this course. The course will assume that you are very familiar with C and Java, and will include excursions into a variety of languages from several language families. There will be significant emphasis on tools, both how to use them and how they are designed and built.