5.39. Software Engineering II (Mandatory)

5.39. Software Engineering II (Mandatory)

Figure 5.39: Connection Map. CS292 Software Engineering II

5.39.1. Justification ↑ Back to top

Software Engineering II builds upon the foundational principles of the first course, shifting focus towards advanced design, software evolution, and the management of large-scale projects. It explores the complexities of maintaining systems, ensuring software quality through rigorous validation, and the application of professional teamwork and project management techniques in collaborative environments.

5.39.2. Generales Goals ↑ Back to top

  1. Apply advanced software design principles and patterns to solve complex architectural problems.
  2. Master software configuration management and collaborative development practices.
  3. Understand the principles of software evolution, refactoring, and maintenance.
  4. Implement systematic testing strategies and understand software reliability.
  5. Develop professional skills for team-based software development and stakeholder management.

5.39.3. Contribution to Outcomes ↑ Back to top

AG-C09) Design and Development of Solutions: Designs, implements, and evaluates solutions for complex computing problems. (Usage)
AG-C03) Individual and Team Work: Performs effectively as an individual and as a member or leader in diverse teams. (Usage)

5.39.4. Content ↑ Back to top

5.39.4.1. Team Collaboration and Dynamics (14 hours) [Skills AG-C03,AG-C09] ↑ Back to top

Bibliography: (Sommerville, 2015; Pressman and Maxim, 2019)

Topics

  1. Effective communication, including oral and written, as well as formal (email, docs, comments, presentations) and informal (team chat, meetings). Technical and Professional Communication , Team Communication and Culture
  2. Common causes of team conflict, and approaches for conflict resolution.
  3. Cooperative programming:
    1. Pair programming or Swarming
    2. Code review
    3. Collaboration through version control enumerate
    4. Roles and responsibilities in a software team: Ethics Codes and Legal Accountability , Professional Responsibility and Public Policy , Professional Values, Nature and Continuing Development , Ethical Dissent and Cultural Context , Workplace Ethics
      1. Advantages of teamwork
      2. Risks and complexity of such collaboration enumerate
      3. Team processes - responsibilities for tasks, effort estimation, meeting structure, work schedule

      Learning Outcomes

      1. Follow effective team communication practices [Analyze]
      2. Articulate the sources of, hazards of, and potential benefits of team conflict - especially focusing on the value of disagreeing about ideas or proposals without insulting people [Articulate]
      3. Facilitate a conflict-resolution and problem-solving strategy in a team setting [Analyze]
      4. Collaborate effectively in cooperative development/programming [Analyze]
      5. Propose and delegate necessary roles and responsibilities in a software development team [Propose]
      6. Compose and follow an agenda for a team meeting [Compose]
      7. Facilitate through involvement in a team project, the central elements of team building, establishing healthy team culture, and team management including creating and executing a team work plan [Create]
      5.39.4.2. Principles and Software Architecture (16 hours) [Skills AG-C03,AG-C09] ↑ Back to top

      Bibliography: (Gamma et al., 1994a; Pressman and Maxim, 2019)

      Topics

      1. System design principles. System Reliability
        1. Levels of abstraction (e.g., architectural design and detailed design)
        2. Separation of concerns
        3. Information hiding
        4. Coupling and cohesion enumerate
        5. Software architecture. System Reliability
          1. Design paradigms
            1. Top-down functional decomposition/layered design
            2. Data-oriented architecture
            3. Object-oriented analysis and design
            4. Event-driven design enumerate
            5. Standard architectures (e.g., client-server and microservice architectures including REST discussions, n-layer, pipes-and-filters, Model View Controller)
            6. Identifying component boundaries and dependencies enumerate
            7. Programming in the large vs programming in the small. System Reliability
            8. Code smells and other indications of code quality, distinct from correctness. Security Design and Controls Engineering , Threat Analysis and Security Engineering , Trusted Computing and Privacy Engineering

            Learning Outcomes

            1. Identify the standard software architecture of a given high-level design [Analyze]
            2. Select and use an appropriate design paradigm to design a simple software system and explain how system design principles have been applied in this design [Evaluate]
            3. Adapt a flawed system design to better follow principles such as separation of concerns or information hiding [Create]
            4. Identify the dependencies among a set of software components in an architectural design [Analyze]
            5.39.4.3. Coding Practices (14 hours) [Skills AG-C03,AG-C09] ↑ Back to top

            Bibliography: (Sommerville, 2015)

            Topics

            1. Practical small-scale testing Software Development Practices
              1. Unit testing
              2. Test-driven development - This is particularly valuable for students psychologically, as it is far easier to engage constructively with the challenge of identifying challenging inputs for a given API (edge cases, corner cases) a priori. If they implement first, the instinct is often to avoid trying to crash their new creation, while a test-first approach gives them the intellectual satisfaction of spotting the problem cases and then watching as more tests pass during the development process. enumerate
              3. Documentation Software Development Practices
                1. Interface documentation - describe interface requirements, potentially including (formal or informal) contracts, pre and post conditions, invariants.
                2. Implementation documentation should focus on tricky and non-obvious pieces of code, whether because the code is using advanced language features, or the behavior of the code is complex. (Do not add comments that re-state common/obvious operations and simple language features.)
                  1. Clarify dataflow, computation, etc., focusing on what the code is.
                  2. Identify subtle/tricky pieces of code and refactor to be self-explanatory if possible or provide appropriate comments to clarify. enumerate enumerate
                  3. Coding style Software Development Practices
                    1. Style guides
                    2. Commenting
                    3. Naming enumerate
                    4. "Best Practices'' for coding: techniques, idioms/patterns, mechanisms for building quality programs Software Development Practices , Information Flow and Non-Interference , Injection and Input Validation , Memory Safety and Types , Malware Analysis and Advanced Security
                      1. Defensive coding practices
                      2. Secure coding practices and principles
                      3. Using exception handling mechanisms to make programs more robust, fault-tolerant enumerate
                      4. Debugging Software Development Practices
                      5. Logging
                      6. Use of libraries and frameworks developed by others Software Development Practices

                      Learning Outcomes

                      1. Write appropriate unit tests for a small component (several functions, a single type, etc.) [Write]
                      2. Write appropriate interface and (if needed) implementation comments for a small component [Write]
                      3. Describe techniques, coding idioms and mechanisms for implementing designs to achieve desired properties such as reliability, efficiency, and robustness [Describe]
                      4. Write robust code using exception handling mechanisms [Write]
                      5. Describe secure coding and defensive coding practices [Describe]
                      6. Select and use a defined coding standard in a small software project [Use]
                      7. Compare and contrast integration strategies including top-down, bottom-up, and sandwich integration [Compare]
                      8. Describe the process of analyzing and implementing changes to code base developed for a specific project [Describe]
                      9. Describe the process of analyzing and implementing changes to a large existing code base [Describe]
                      5.39.4.4. Verification and validation Concepts (10 hours) [Skills AG-C03,AG-C09] ↑ Back to top

                      Bibliography: (Pressman and Maxim, 2019)

                      Topics

                      1. Verification and validation concepts
                        1. Verification: Are we building the thing right?
                        2. Validation: Did we build the right thing? enumerate
                        3. Why testing matters: Does the component remain functional as the code evolves?
                        4. Testing objectives
                          1. Usability
                          2. Reliability
                          3. Conformance to specification
                          4. Performance
                          5. Security enumerate

                          Learning Outcomes

                          1. Explain why testing is important [Explain]
                          2. Distinguish between program validation and verification [Distinguish]
                          3. Describe different objectives of testing [Describe]
                          5.39.4.5. Testing Tools and Analysis (4 hours) [Skills AG-C03,AG-C09] ↑ Back to top

                          Bibliography: (Sommerville, 2015; Pressman and Maxim, 2019)

                          Topics

                          1. Verification and validation tooling and automation
                            1. Static analysis
                            2. Code coverage
                            3. Fuzzing
                            4. Dynamic analysis and fault containment (sanitizers, etc.)
                            5. Fault logging and fault tracking enumerate
                            6. Test planning and generation
                              1. Fault estimation and testing termination including defect seeding
                              2. Use of random and pseudo random numbers in testing enumerate
                              3. Testing asynchronous, parallel, and concurrent systems
                              4. Verification and validation of non-code artifacts (documentation, training materials)

                              Learning Outcomes

                              1. Describe and compare different tools for verification and validation [Describe]
                              2. Automate the use of different tools in a small software project [Design]
                              3. Explain how and when random numbers should be used in testing [Explain]
                              4. Describe approaches for fault estimation [Describe]
                              5. Estimate the number of faults in a small software application based on fault density and fault seeding [Estimate]
                              6. Describe techniques and issues with testing asynchronous, concurrent, and parallel software [Describe]
                              7. Create a test plan for a medium-size code segment which contains asynchronous, concurrent, and/or parallel code, including a test matrix and generation of test data and inputs [Create]
                              8. Describe techniques for the verification and validation of non-code artifacts [Describe]
                              5.39.4.6. Performance Testing and Benchmarking (4 hours) [Skills AG-C03,AG-C09] ↑ Back to top

                              Bibliography: (Bondi, 2015; Gregg, 2020)

                              Topics

                              1. Performance testing and benchmarking
                                1. Throughput and latency
                                2. Degradation under load (stress testing, FIFO vs LIFO handling of requests)
                                3. Speedup and scaling
                                  1. Amdahl's law
                                  2. Gustafson's law
                                  3. Soft and weak scaling enumerate
                                  4. Identifying and measuring figures of merits
                                  5. Common performance bottlenecks
                                    1. Compute-bound
                                    2. Memory-bandwidth bound
                                    3. Latency-bound enumerate
                                    4. Statistical methods and best practices for benchmarking
                                      1. Estimation of uncertainty
                                      2. Confidence intervals enumerate
                                      3. Analysis and presentation (graphs, etc.)
                                      4. Timing techniques enumerate

                                      Learning Outcomes

                                      1. Describe throughput and latency and provide examples of each [Describe]
                                      2. Explain speedup and the different forms of scaling and how they are computed [Explain]
                                      3. Describe common performance bottlenecks [Describe]
                                      4. Describe statistical methods and best practices for benchmarking software [Describe]
                                      5. Explain techniques for and challenges with measuring time when constructing a benchmark [Explain]
                                      6. Identify the figures of merit, construct and run a benchmark, and statistically analyze and visualize the results for a small software project [Analyze]
                                      5.39.4.7. Reliability Concepts (10 hours) [Skills AG-C03,AG-C09] ↑ Back to top

                                      Bibliography: (Sommerville, 2015)

                                      Topics

                                      1. Concept of reliability as probability of failure or mean time between failures, and faults as cause of failures
                                      2. Identifying reliability requirements for different kinds of software
                                      3. Software failures caused by defects/bugs, and so for high reliability the goal is to have minimum defects - by injecting fewer defects (better training, education, planning), and by removing most of the injected defects (testing, code review, etc.)
                                      4. Software reliability, system reliability and failure behavior
                                      5. Defect injection and removal cycle, and different approaches for defect removal
                                      6. Compare the "error budget'' approach to reliability with the "error-free'' approach and identify domains where each is relevant.

                                      Learning Outcomes

                                      1. Describe how to determine the level of reliability required by a software system [Describe]
                                      2. Explain the problems that exist in achieving very high levels of reliability [Explain]
                                      3. Understand approaches to minimizing faults that can be applied at each stage of the software lifecycle [Explain]

                                      5.39.5. Bibliography ↑ Back to top

                                      Sommerville, I. (2015). Software Engineering. Pearson, 10th edition.

                                      Pressman, R. S. and Maxim, B. (2019). Software Engineering: A Practitioner's Approach. McGraw-Hill Education, 9th edition.

                                      Gamma, E., Helm, R., Johnson, R., and Vlissides, J. (1994a). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional, Reading, MA, 1st edition.

                                      Bondi, A. B. (2015). Foundations of Software and System Performance Engineering: Process, Performance Modeling, Requirements, Testing, Scalability, and Practice. Addison-Wesley, Upper Saddle River, NJ.

                                      Gregg, B. (2020). Systems Performance: Enterprise and the Cloud. Addison-Wesley Professional, Boston, MA, 2nd edition.

                                      Spotted a typo, an outdated course, a broken link, or have a suggestion? Let us know.

                                      Scan to open on your phone