This is a mixed under- and graduate-level elective course on the basic principles of designing software systems. The course is intended to create a foundation for designing good software and provide the tools for practical usage in the industry. This course has a heavy emphasis on small programming projects. There are also readings assigned for each class and a final exam. Upon successful completion of this course, the student should be able to:
- Understand key principles of software design.
- Develop the ability to critique and improve software designs.
- Explore different methodologies and apply them in software design.
- Gain insights into real-world software engineering challenges and solutions.
- Apply best practices for software construction.
We profoundly believe that there are only two main problems worth teaching to grow a good software architect - system decomposition and abstraction creation (composition). Everything else can be found in standards and normative documents. We focus on creating a sense of systems and abstractions, processes for decomposing and composing systems. We try to bring those notions into a language – a pattern language similar to the one that was created in the seminal Christopher Alexander’s book “Pattern Language” and, in our humble opinion, was misused in the GoF “Design Patterns” book. This course explores the principles and practices of software design and architecture, focusing on the philosophies and strategies outlined in essential texts. Students will learn to apply these concepts to create robust, maintainable, and scalable software systems.
Required materials
- John Osterhout, Philosophy of Software Design
- George Fairbanks, Just Enough Software Architecture, Risk-based approach.
- Fred Brooks, Design of Design
- Juval Löwy, Righting Software