2.13. Software Engineering (SE)

2.13. Software Engineering (SE)

As far back as the early 1970s, British computer scientist Brian Randell allegedly said, "Software engineering is the multi-person construction of multi-version programs.'' This is an essential insight: while programming is the skill that governs our ability to write a program, software engineering is distinct in two dimensions: time and people.

First, a software engineering project is a team endeavor; being a solitary programming expert is insufficient. Skilled software engineers must demonstrate expertise in communication and collaboration. Programming may be an individual activity, but software engineering is a collaborative one, deeply tied to issues of professionalism, teamwork, and communication.

Second, a software engineering project is usually "multi-version.'' It has an expected lifespan; it needs to function properly for months, years, or decades. Features may be added or removed to meet product requirements. The engineering team itself will likely change. The technological context will shift, as our computing platforms evolve, programming languages change, dependencies upgrade, etc. This exposure to matters of time and change is novel when compared to a programming project: it isn't enough to build a thing that works, instead it must work and stay working. Many of the most challenging topics in tech share "time will lead to change'' as a root cause: backward compatibility, version skew, dependency management, schema changes, protocol evolution.

Software engineering presents a particularly difficult challenge for learning in an academic setting. Given that the major differences between programming and software engineering are time and teamwork, it is hard to generate lessons that *require* successful teamwork and that faithfully present the challenges of time. Additionally, some topics in software engineering will be more authentic and more relevant if our learners experience collaborative and long-term software engineering projects *in vivo* rather than in the classroom. Regardless of whether that happens as an internship, involvement in an open-source project, or full-time engineering role, a month of full-time hands-on experience has more available hours than the average software engineering course.

Thus, a software engineering curriculum must focus on concepts needed by most new-graduate hires, and that either are novel for those who are trained primarily as programmers, or that are abstract concepts that may not get explicitly stated/shared on the job. Such topics include, but are not limited to:

  • Testing
  • Teamwork, collaboration
  • Communication
  • Design
  • Maintenance and evolution
  • Software engineering tools

All evidence suggests that the role of software in our society will continue to grow for the foreseeable future. Additionally, the era of "two programmers in a garage'' seems to have drawn to a close. Most important software these days is a team effort, building on existing code and leveraging existing functionality. The study of software engineering skills is a deeply important counterpoint to the everyday experience of computing students - we must impress on them the reality that few software projects are managed by writing from scratch as a solo endeavor. Communication, teamwork, planning, testing, and tooling are far more important as our students move on from the classroom and make their mark on the wider world.

Although most CS graduates will go on to an industry position that requires this material, the CS Core topics presented here are of value regardless of whether graduates go on to industry or academia.

Table 2.13: List of KUs in the Software Engineering area.

2.13.1. SE/Team Collaboration and Dynamics  (CS Core: 2 hrs, KA Core: 2 hrs) ↑ Back to top

Topics:
Core

Learning Outcomes:
Core:

  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]

2.13.2. SE/Diversity, Stakeholders and Distributed Teams  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

Topics:
Core

  • Importance of team diversity and inclusivity. Technical and Professional Communication , Team Communication and Culture
  • Interfacing with stakeholders, as a team:
    1. Management & other non-technical teams
    2. Customers
    3. Users enumerate
    4. Risks associated with physical, distributed, hybrid, and virtual teams - including communication, perception, structure, points of failure, mitigation, and recovery, etc.

    Learning Outcomes:
    Core:

    1. Promote the importance of and benefits that diversity and inclusivity brings to a software development team [Defend]
    2. Reference, as a team, the importance of, and strategies to interface with stakeholders outside the team on both technical and non-technical levels [Reference]
    3. Enumerate the risks associated with physical, distributed, hybrid, and virtual teams and possible points of failure and how to mitigate against and recover/learn from failures [Enumerate]

    2.13.3. SE/Version Control and CI/CD  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

    Topics:
    Core

    • Software configuration management and version control: Software Development Practices
      1. Configuration in version control, reproducible builds/configuration.
      2. Version control branching strategies. Development branches vs release branches. Trunk-based development.
      3. Merging/rebasing strategies, when relevant. enumerate
      4. Release management.
      5. Testing tools including static and dynamic analysis tools. Software Development Practices , Information Flow and Non-Interference , Injection and Input Validation , Memory Safety and Types , Malware Analysis and Advanced Security
      6. Software process automation:
        1. Build systems - the value of fast, hermetic, reproducible builds, compare/contrast approaches to building a project.
        2. Continuous Integration (CI) - the use of automation and automated tests to do preliminary validation that the current head/trunk revision builds and passes (basic) tests.
        3. Continuous Deployment (CD) - the use of automation to automatically release every change that passes the automated tests to the production environment, ensuring frequent and reliable deliveries.
        4. Dependency management - updating external/upstream dependencies, package management, SemVer. enumerate

        Learning Outcomes:
        Core:

        1. Describe the difference between centralized and distributed software configuration management [Describe]
        2. Describe how version control can be used to help manage software release management [Describe]
        3. Identify configuration items and use a source code control tool in a small team-based project [Analyze]
        4. Describe how available static and dynamic test tools can be integrated into the software development environment [Describe]
        5. Understand the use of CI/CD systems as a ground-truth for the state of the team's shared code (build and test success) [Explain]

        2.13.4. SE/Development Environment and IDE  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

        Topics:
        Core

        Learning Outcomes:
        Core:

        1. Describe the issues that are important in selecting a set of tools for the development of a specific software system, including tools for requirements tracking, design modeling, implementation, build automation, and testing [Describe]
        2. Demonstrate the capability to use software tools in support of the development of a software product of medium size [Demonstrate]

        2.13.5. SE/Requirements Engineering  (KA Core: 2 hrs) ↑ Back to top

        Topics:
        Core

        Learning Outcomes:
        Core:

        1. Compare different methods of eliciting requirements along multiple axes [Compare]
        2. Identify differences between two methods of describing functional requirements (e.g., customer interviews, user studies) and the situations where each would be preferred [Analyze]
        3. Identify which behaviors are required, allowed, or barred from a given set of requirements and a list of candidate behaviors [Analyze]
        4. Collect a set of requirements for a simple software system [Analyze]
        5. Identify areas of a software system that need to be changed, given a description of the system and a set of new requirements to be implemented [Analyze]
        6. Identify the functional and non-functional requirements in a set of requirements [Analyze]

        2.13.6. SE/Requirements Evolution and Estimation  (KA Core: 1 hr) ↑ Back to top

        Topics:
        Non Core

        • Prototyping a tool for both eliciting and validating/confirming requirements.
        • Product evolution: when requirements change, how to understand what effect that has and what changes need to be made.
        • Effort estimation:
          1. Learning techniques for better estimating the effort required to complete a task;
          2. Practicing estimation and comparing it to how long tasks take;
          3. Effort estimation is quite difficult, so students are likely to be way off in many cases, but seeing the process play out with their own work is valuable. enumerate

          Learning Outcomes:
          NonCore:

          1. Create a prototype of a software system to validate a set of requirements - building a mock-up, MVP, etc [Create]
          2. Estimate the time to complete a set of tasks, then compare estimates to the actual time taken [Estimate]
          3. Determine an implementation sequence for a set of tasks, adhering to dependencies between them, with a goal to retire risk as early as possible [Determine]
          4. Write a requirement specification for a simple software system [Write]

          2.13.7. SE/Principles and Software Architecture  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

          Topics:
          Core

          Learning Outcomes:
          Core:

          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]

          2.13.8. SE/API Design and Modeling  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

          Topics:
          Core

          • API design principles
            1. Consistency
              1. Consistent APIs are easier to learn and less error-prone
              2. Consistency is both internal (between different portions of the API) and external (following common API patterns) enumerate
              3. Composability
              4. Documenting contracts
                1. API operations should describe their effect on the system, but not generally their implementation
                2. Preconditions, postconditions, and invariants enumerate
                3. Expandability
                4. Error reporting
                  1. Errors should be clear, predictable, and actionable
                  2. Input that does not match the contract should produce an error
                  3. Errors that can be reliably managed without reporting should be managed enumerate enumerate
                  4. Identifying and codifying data invariants and time invariants
                  5. Structural and behavioral models of software designs

                  Learning Outcomes:
                  Core:

                  1. Design an API for a single component of a large software system, including identifying and documenting each operation's invariants, contract, and error conditions [Design]
                  2. Evaluate an API description in terms of consistency, composability, and expandability [Evaluate]
                  3. Expand an existing design to include a new piece of functionality [Create]

                  2.13.9. SE/Software Design Quality and Evaluation  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

                  Topics:
                  Core

                  • Data design Data Modeling
                    1. Data structures
                    2. Storage systems enumerate
                    3. Requirement traceability
                      1. Understanding which requirements are satisfied by a design enumerate

                      Non Core

                      Learning Outcomes:
                      Core:

                      1. Design a set of data structures to implement a provided API surface [Design]
                      2. Identify which requirements are satisfied by a provided software design [Analyze]

                      NonCore:

                      1. Translate a natural language software design into class diagrams [Translate]
                      2. Adapt a flawed system design to better follow the principles of least privilege and fail-safe defaults [Create]
                      3. Contrast two software designs across different qualities, such as efficiency or usability [Contrast]

                      2.13.10. SE/Coding Practices  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

                      Topics:
                      Core

                      • 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:
                                Core:

                                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]

                                2.13.11. SE/Large-Scale Construction and Process  (CS Core: 1 hr, KA Core: 2 hrs) ↑ Back to top

                                Topics:
                                Non Core

                                • Larger-scale testing
                                  1. Test doubles (stubs, mocks, fakes)
                                  2. Dependency injection enumerate
                                  3. Work sequencing, including dependency identification, milestones, and risk retirement
                                    1. Dependency identification: Identifying the dependencies between different tasks
                                    2. Milestones: A collection of tasks that serve as a marker of progress when completed. Ideally, the milestone encompasses a useful unit of functionality.
                                    3. Risk retirement: Identifying what elements of a project are risky and prioritizing completing tasks that address those risks. enumerate
                                    4. Potential security problems in programs Information Flow and Non-Interference , Injection and Input Validation , Memory Safety and Types , Malware Analysis and Advanced Security
                                      1. Buffer and other types of overflows
                                      2. Race conditions
                                      3. Improper initialization, including choice of privileges
                                      4. Input validation enumerate
                                      5. Documentation (autogenerated)
                                      6. Development context: "green field'' vs existing code base
                                        1. Change impact analysis
                                        2. Change actualization enumerate
                                        3. Release management
                                        4. DevOps practices

                                        Learning Outcomes:
                                        NonCore:

                                        1. Rewrite a simple program to remove common vulnerabilities, such as buffer overflows, integer overflows and race conditions [Apply]
                                        2. Write a software component that performs some non-trivial task and is resilient to input and run-time errors [Write]

                                        2.13.12. SE/Verification and validation Concepts  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

                                        Topics:
                                        Core

                                        • 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:
                                            Core:

                                            1. Explain why testing is important [Explain]
                                            2. Distinguish between program validation and verification [Distinguish]
                                            3. Describe different objectives of testing [Describe]

                                            2.13.13. SE/Test Planning and Types  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

                                            Topics:
                                            Core

                                            • Test kinds
                                              1. Unit
                                              2. Integration
                                              3. Validation
                                              4. System enumerate
                                              5. Stylistic differences between tests and production code: DAMP vs DRY - more duplication is warranted in test code.
                                              6. Test planning and generation
                                                1. Test case generation, from formal models, specifications, etc.
                                                2. Test coverage
                                                  1. Test matrices
                                                  2. Code coverage - how much of the code is tested?
                                                  3. Environment coverage - how many hardware architectures, operating systems, browsers, etc. are tested? enumerate
                                                  4. Test data and inputs enumerate

                                                  Learning Outcomes:
                                                  Core:

                                                  1. Compare and contrast the different types and levels of testing (regression, unit, integration, systems, and acceptance) [Compare]
                                                  2. Describe techniques for creating a test plan and generating test cases [Describe]
                                                  3. Create a test plan for a medium-size code segment which includes a test matrix and generation of test data and inputs [Create]
                                                  4. Implement a test plan for a medium-size code segment [Implement]

                                                  2.13.14. SE/Advanced Testing Practices  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

                                                  Topics:
                                                  Core

                                                  • Test development
                                                    1. Test-driven development
                                                    2. Object oriented testing, mocking, and dependency injection
                                                    3. Opaque-box (previously, black-box) and transparent-box (previously, white-box) testing techniques
                                                    4. Test tooling, including code coverage, static analysis, and fuzzing enumerate
                                                    5. Verification and validation in the development cycle
                                                      1. Code reviews
                                                      2. Test automation, including automation of tooling
                                                      3. Pre-commit and post-commit testing
                                                      4. Tradeoffs between test coverage and throughput/latency of testing
                                                      5. Defect tracking and prioritization: reproducibility of reported defects enumerate
                                                      6. Domain specific verification and validation challenges
                                                        1. Performance testing and benchmarking
                                                        2. Asynchrony, parallelism, and concurrency
                                                        3. Safety-critical
                                                        4. Numeric enumerate

                                                        Learning Outcomes:
                                                        Core:

                                                        1. Identify the fundamental principles of test-driven development methods and explain the role of automated testing in these methods [Analyze]
                                                        2. Discuss issues involving the testing of object-oriented software [Debate]
                                                        3. Describe mocking and dependency injection and their application [Describe]
                                                        4. Undertake, as part of a team activity, a code review of a medium-size code segment [Evaluate]
                                                        5. Describe the role that tools can play in the validation of software [Describe]
                                                        6. Automate the testing in a small software project [Design]
                                                        7. Explain the roles, pros, and cons of pre-commit and post-commit testing [Explain]
                                                        8. Discuss the tradeoffs between test coverage and test throughput/latency and how this can impact verification [Debate]
                                                        9. Use a defect tracking tool to manage software defects in a small software project [Use]
                                                        10. Discuss the limitations of testing in certain domains [Debate]

                                                        2.13.15. SE/Testing Tools and Analysis  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

                                                        Topics:
                                                        Non Core

                                                        • 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:
                                                            NonCore:

                                                            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]

                                                            2.13.16. SE/Performance Testing and Benchmarking  (CS Core: 1 hr, KA Core: 1 hr) ↑ Back to top

                                                            Topics:
                                                            Non Core

                                                            • 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:
                                                                    NonCore:

                                                                    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]

                                                                    2.13.17. SE/API Compatibility and Versioning  (KA Core: 2 hrs) ↑ Back to top

                                                                    Topics:
                                                                    Core

                                                                    • Hyrum's Law/The Law of Implicit Interfaces
                                                                    • Backward compatibility
                                                                      1. Compatibility is not a property of a single entity, it's a property of a relationship.
                                                                      2. Backward compatibility needs to be evaluated in terms of provider + consumer(s) or with a well-specified model of what forms of compatibility a provider aspires to/promises. enumerate
                                                                      3. Versioning
                                                                        1. Semantic Versioning (SemVer)
                                                                        2. Trunk-based development enumerate

                                                                        Learning Outcomes:
                                                                        Core:

                                                                        1. Identify both explicit and implicit behavior of an interface and identify potential risks from Hyrum's Law [Analyze]
                                                                        2. Identify changes that can be broadly considered "backward compatible,'' potentially with explicit statements about what usage is or is not supported [Analyze]
                                                                        3. Evaluate whether a proposed change is sufficiently safe given the versioning methodology in use for a given project [Evaluate]

                                                                        2.13.18. SE/Refactoring Techniques  (KA Core: 1 hr) ↑ Back to top

                                                                        Topics:
                                                                        Core

                                                                        • Refactoring
                                                                          1. Standard refactoring patterns (rename, inline, outline, etc.)
                                                                          2. Use of refactoring tools in IDE
                                                                          3. Application of static-analysis tools (to identify code in need of refactoring, generate changes, etc.)
                                                                          4. Value of refactoring as a remedy for technical debt enumerate

                                                                          Non Core

                                                                          • "Large Scale'' Refactoring - techniques when a refactoring change is too large to commit safely (large projects), or when it is impossible to synchronize change between provider + all consumers (multiple repositories, consumers with private code).
                                                                            1. Express both old and new APIs so that they can co-exist.
                                                                            2. Minimize the size of behavior changes.
                                                                            3. Why these techniques are required, (e.g., "API consumers I can see'' vs "consumers I can't see''). enumerate

                                                                            Learning Outcomes:
                                                                            Core:

                                                                            1. Consider inputs from static analysis tools and/or Software Design principles to identify code in need of refactoring [Analyze]
                                                                            2. Refactor the implementation of an interface to improve design, clarity, etc. with minimal/zero impact on existing users [Create]

                                                                            NonCore:

                                                                            1. Plan a complex multi-step refactoring to change default behavior of an API safely [Plan]

                                                                            2.13.19. SE/Reliability Concepts  (KA Core: 2 hrs) ↑ Back to top

                                                                            Topics:
                                                                            Core

                                                                            • Concept of reliability as probability of failure or mean time between failures, and faults as cause of failures
                                                                            • Identifying reliability requirements for different kinds of software
                                                                            • 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.)
                                                                            • Software reliability, system reliability and failure behavior
                                                                            • Defect injection and removal cycle, and different approaches for defect removal
                                                                            • Compare the "error budget'' approach to reliability with the "error-free'' approach and identify domains where each is relevant.

                                                                            Learning Outcomes:
                                                                            Core:

                                                                            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]

                                                                            2.13.20. SE/Reliability Engineering  (KA Core: 1 hr) ↑ Back to top

                                                                            Topics:
                                                                            Non Core

                                                                            • Software reliability models
                                                                            • Software fault tolerance techniques and models
                                                                              1. Contextual differences in fault tolerance (e.g., crashing a flight critical system is strongly avoided, crashing a data processing system before corrupt data is written to storage is highly valuable) enumerate
                                                                              2. Software reliability engineering practices - including reviews, testing, practical model checking
                                                                              3. Identification of dependent and independent failure domains, and their impact on system reliability
                                                                              4. Measurement-based analysis of software reliability - telemetry, monitoring and alerting, dashboards, release qualification metrics, etc.

                                                                              Learning Outcomes:
                                                                              NonCore:

                                                                              1. Demonstrate the ability to apply multiple methods to develop reliability estimates for a software system [Demonstrate]
                                                                              2. Identify methods that will lead to the realization of a software architecture that achieves a specified level of reliability [Analyze]
                                                                              3. Identify ways to apply redundancy to achieve fault tolerance [Analyze]
                                                                              4. Identify single-point-of-failure (SPF) dependencies in a system design [Analyze]

                                                                              2.13.21. SE/Formal Methods ↑ Back to top

                                                                              Topics:
                                                                              Non Core

                                                                              • Formal specification of interfaces
                                                                                1. Specification of pre- and post- conditions
                                                                                2. Formal languages for writing and analyzing pre- and post-conditions. enumerate
                                                                                3. Problem areas well served by formal methods
                                                                                  1. Lock-free programming, data races
                                                                                  2. Asynchronous and distributed systems, deadlock, livelock, etc. enumerate
                                                                                  3. Comparison to other tools and techniques for defect detection
                                                                                    1. Testing
                                                                                    2. Fuzzing enumerate
                                                                                    3. Formal approaches to software modeling and analysis
                                                                                      1. Model checkers
                                                                                      2. Model finders enumerate

                                                                                      Learning Outcomes:
                                                                                      NonCore:

                                                                                      1. Describe the role formal specification and analysis techniques can play in the development of complex software and compare their use as validation and verification techniques with testing [Describe]
                                                                                      2. Apply formal specification and analysis techniques to software designs and programs with low complexity [Apply]
                                                                                      3. Explain the potential benefits and drawbacks of using formal specification languages [Explain]

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

                                                                                      Scan to open on your phone