An introductory course surveying the general process of design and problem solving, applied not just to computing science but also to disciplines more generally. The student will be introduced to the notion of requirements and how the implementation of software represents the end product of the design process, with an emphasis on how the quality fo the end product directly reflects the process by which it was conceived. We will consider the pervasiveness of software and explicitly take plaform-specific considerations into account during design.

This course will examine the techniques and tools used in the development of large software systems. The student will be introduced to methods for the organization and construction of modular systems, the manipulation of files, user interface (textual and graphical) design and implementation and fundamental database concepts. Lectures focus on issues of coding style, pragmatic approaches to the construction of software, and the application and appropriate use of the wealth of software tools available for system development. The assignments complement this material by permitting the student to explore these concepts through a large scale cumulative implementation.

This course will examine the historical development of design methodologies and working with legacy systems. It will include an examination of programming paradigms and trends in software design from the past and present. This course covers the traditional software development lifecycles. A group project involving a large-team design and development experience will be the focus of the course.

Object-Oriented Structural Design, Structural UML, Structural Patterns, Software Architecture, Distributed Architecture, High Level Reuse 

An introduction to the issues and techniques encountered in the design and construction of software systems. The theory and models of software evolution. Topics include requirements and specifications, prototyping, design principles, object-oriented analysis and design, standards, integration, risk analysis, testing, and debugging. 

This course serves as an introduction to systematic methods of testing and verification, covering a range of static and dynamic techniques and their use within the software development process.