http://www.cs.dartmouth.edu/courseguide/undergrad/cs_23.html
Techniques for building large, reliable, maintainable, and understandable software systems. Topics include programming paradigms for real systems, systems programming tools, interfaces for both multi-user and workstation programming environments, functional programming, software engineering, structured design, testing, and documentation. Concepts are reinforced through technical and cultural readings, written homework, several medium-scale programs, and one large-scale group programming project.