CSCI 370 – Midterm Extended Review Sheet
March 25 Lecture
Chapter 1: Introduction to Software Engineering
Section titled “Chapter 1: Introduction to Software Engineering”What is Software Engineering?
Section titled “What is Software Engineering?”- A field concerned with the systematic design, development, and maintenance of software.
- Involves everything needed to deliver a software product, excluding hardware and financing.
What is a Software Project?
Section titled “What is a Software Project?”- Everything related to delivering a software product is considered part of the software project.
- Not included: hardware and financing components.
📋 Software Development Lifecycle (SDLC)
Section titled “📋 Software Development Lifecycle (SDLC)”1. Feasibility
Section titled “1. Feasibility”- Can the project be done?
- Technical Feasibility: Does the development team have the skills?
- Financial Feasibility: Does the client have the budget?
2. Requirement Specification
Section titled “2. Requirement Specification”- Define what the software should do before writing any code.
- Critical to avoid rework later.
3. Design / Architecture
Section titled “3. Design / Architecture”- Plan how the software will be built (components, modules, classes, etc.).
- Often uses UML diagrams or architecture schematics.
4. Programming (aka Coding, Development, Implementation)
Section titled “4. Programming (aka Coding, Development, Implementation)”- Writing the actual software based on the design.
- Tip: On resumes, use varied terminology to describe this.
5. Testing (QA)
Section titled “5. Testing (QA)”- Quality Assurance ensures the software works as intended.
- Unit testing: Performed by developers, focuses on small pieces of functionality.
- QA testing: Done by testers, simulates user behavior and interaction.
6. Release and Deployment
Section titled “6. Release and Deployment”- Delivering the software to users.
7. Documentation
Section titled “7. Documentation”- Writing guides, manuals, or internal comments.
- Downside: Can become outdated if not updated with code changes.
8. Maintenance (Software Evolution)
Section titled “8. Maintenance (Software Evolution)”- Ongoing improvements and bug fixes.
- Repeats the software lifecycle steps (like a loop).
📈 Changes in Software Engineering Over Time
Section titled “📈 Changes in Software Engineering Over Time”Technology’s Impact
Section titled “Technology’s Impact”- AI integration: Used in tools, code generation, etc.
- Cross-platform challenges: Must run on iOS, Android, Windows, etc.
- Web software: Easier cross-platform deployment via the browser.
- Security: Bigger concern due to global accessibility.
- Faster delivery: Shorter time-to-market expectations.
✅ Software Quality Attributes (Buzzwords)
Section titled “✅ Software Quality Attributes (Buzzwords)”- Performance: Speed and responsiveness.
- Usability: How easy and intuitive the interface is (UI/UX).
- Reliability: Will it run without crashing?
- Functionality:
- Functional: Specific features requested.
- Non-functional: General qualities like performance, security, reliability.
- Maintainability: Ease of making changes (affected by code cleanliness).
- Security vs. Safety:
- Security: Protection of data and systems.
- Safety: Ensuring physical or real-world harm is prevented (e.g., in cars).
💻 Types of Software
Section titled “💻 Types of Software”1. Standalone
Section titled “1. Standalone”- No network connection; runs locally.
2. Transaction-Based
Section titled “2. Transaction-Based”- Must maintain data integrity (all-or-nothing updates).
3. Web Software (Client-Server Architecture)
Section titled “3. Web Software (Client-Server Architecture)”- Browser is the client; server hosts the logic/data.
4. Financial Software
Section titled “4. Financial Software”- Must be accurate and often fast (e.g., trading systems).
🧱 Object-Oriented Programming (OOP)
Section titled “🧱 Object-Oriented Programming (OOP)”Object vs. Class
Section titled “Object vs. Class”- Class: Template (e.g.,
Car). - Object: Instance of a class (e.g., a specific car with VIN #).
Four OOP Principles
Section titled “Four OOP Principles”- Inheritance – Reuse code by having child classes inherit behavior from parent classes.
- Encapsulation – Protect internal data using access control (e.g., private fields with getters/setters).
- Polymorphism – One method name behaves differently depending on input types.
- Abstraction – Hide complex logic behind simple interfaces/methods.
📆 Design Principles & Patterns
Section titled “📆 Design Principles & Patterns”Composition Over Inheritance
Section titled “Composition Over Inheritance”- Prefer using object composition to reuse behavior rather than extending classes.
- Avoids inheritance’s drawbacks:
- Single inheritance limitation in Java.
- Fragile base class problem.
Strategy Pattern
Section titled “Strategy Pattern”- A design pattern where behaviors are encapsulated as objects and can be swapped at runtime.
- Promotes open/closed principle.
Observer Pattern
Section titled “Observer Pattern”- Allows objects (observers) to subscribe to and receive updates from another object (subject).
- Used in event-driven systems.
- Also supports open/closed principle: you can add new observers without modifying the subject.
🧬 SOLID Principles
Section titled “🧬 SOLID Principles”- S - Single Responsibility:
- A class should only have one reason to change.
- O - Open/Closed Principle:
- Classes should be open for extension, closed for modification.
- L - Liskov Substitution:
- Subclasses should behave like their parent classes when substituted.
- I - Interface Segregation:
- No client should be forced to depend on methods it doesn’t use.
- D - Dependency Inversion:
- Depend on abstractions, not concrete implementations.
😄 Code Quality Principles
Section titled “😄 Code Quality Principles”- DRY (Don’t Repeat Yourself): Reuse code logic to avoid redundancy.
- YAGNI (You Aren’t Gonna Need It): Don’t implement functionality until needed.
- Refactoring: Restructuring existing code to improve readability/maintainability.
- Delegation Principle: Offload responsibility to composed/helper objects instead of cluttered logic (e.g., lots of
ifstatements).
💡 Process Models
Section titled “💡 Process Models”1. Waterfall
Section titled “1. Waterfall”- Linear model with distinct, non-overlapping phases.
- Pros: Better for fixed-scope, expensive-to-change projects.
- Cons: Inflexible; prone to delayed delivery.
2. Incremental (Agile, Scrum, XP)
Section titled “2. Incremental (Agile, Scrum, XP)”- Iterative development; working software delivered every cycle.
- Scrum:
- Roles: Product Owner, Scrum Master, Dev Team.
- Artifacts: Product Backlog, Sprint Backlog, Burndown Charts.
- Meetings: Daily Stand-ups, Sprint Reviews.
3. Reuse-Oriented Development
Section titled “3. Reuse-Oriented Development”- Emphasizes use of existing libraries, packages, or software.
- Saves time, cost, and reduces bugs.
🔧 Agile Practices
Section titled “🔧 Agile Practices”- Test-First Development: Write tests before implementation.
- Smoke Testing: Basic test to check if the app doesn’t crash.
- Regression Testing: Ensure fixed bugs don’t reappear.
- Story Cards: Represent individual features or requirements.
- Pair Programming: Two developers work together at one workstation.
- Collective Ownership: Everyone can modify any part of the codebase.
- Sustainable Pace: No developer burnout; maintain work-life balance.
- Small Releases: Deliver in small, frequent iterations.
- Customer Involvement: Regular feedback from real users.
📊 Estimation & Prioritization
Section titled “📊 Estimation & Prioritization”- Velocity Chart: Measures how much work is completed in each sprint.
- Burndown Chart: Tracks remaining work over time.
- Prioritization:
- High Value, Low Cost → Do first
- High Value, High Cost
- Low Value, Low Cost
- Low Value, High Cost → Maybe never
📏 UML (Unified Modeling Language)
Section titled “📏 UML (Unified Modeling Language)”Class Diagrams
Section titled “Class Diagrams”- Association: Regular connection (plain line).
- Aggregation: Open diamond; “has-a” relationship (loosely bound).
- Composition: Filled diamond; strong ownership.
- Generalization: Triangle arrow; represents inheritance.
- Multiplicity: 1, 0..1, 0.., 1..