Software Development: A Comprehensive Overview
Software Engineering
Software engineering integrates methods, tools, and procedures for software development to produce quality programs, developed on time, documented, and within budget.
Quality Management in Software
Key elements of software quality include:
- Methodologies for process control, analysis, and improvement.
- Tools and techniques such as use cases and UML diagrams.
- People as creators and implementers of software.
- Metrics to assess development status and address shortcomings.
Aspects of Quality
- Internal: Measurable from internal features like source code.
- External: Measured in terms of product performance.
- Usage: Observed by users during use.
Software Quality Properties
- Maintainability: Code written to evolve and meet new needs.
- Reliability: Software must be dependable, safe, and free of defects causing physical or economic harm.
- Efficiency: Proper use of resources.
- Usability: Easy-to-use interface and adequate documentation.
Software Processes and Models
A software process is a set of activities to develop, maintain, and manage software production.
Product quality is largely determined by the quality of processes used in its development and maintenance.
A process model is a structured collection of proven effective practices. It dictates what to do and how.
CMMI
CMMI is a model for process improvement and evaluation, providing essential elements for more efficient processes. It has several maturity levels:
- Initial: No project status control, opaque development.
- Repeatable: Project managed and controlled during development.
- Defined: Managed process conforming to organizational process policies.
- Quantitatively Managed: Defined process controlled using quantitative techniques.
- Optimizing: Routinely reviewed and modified for business objectives. Continuous improvement.
Software Principles
- Abstraction: Focus on functionality, ignoring irrelevant details.
- Encapsulation: Hide details not affecting other modules.
- Modularity: Divide the solution into separate modules.
- Localization: Group similar or related items.
- Uniformity: Modules should have similar notation.
- Completeness: Develop all system aspects.
- Validation: Verify development correctness.
Software Lifecycle
Definition/Analysis: Project planning, feasibility analysis, risk management, and requirements gathering.
Development: Designing data structures and interfaces, coding, and testing.
Maintenance: Correcting errors, adding new requirements and functionalities.
Lifecycle Types
Waterfall: Sequential phases. Simple but unrealistic, propagating errors.
V-Model: Layered development with checks and tests for early error detection.
Agile Manifesto
- Focus on the development team and interactions.
- Prioritize functional software over extensive documentation.
- Close customer collaboration.
- Respond to changes, even if they alter the plan.
Agile Methodologies
- RUP
- XP (Extreme Programming): For dynamic environments and small teams.
- Emphasizes verbal communication.
- Simple design.
- Short deliveries (2-3 weeks).
- Use of standards.
- High customer involvement.
Software Requirements
Misunderstanding users and their needs is a major cause of process failure.
A requirement is a software feature needed by the user to solve a problem or achieve an objective.
Requirements management involves discovering, organizing, and documenting user needs.
Information Gathering Techniques
- Interviews: Extract information from users.
- Observation: Observe users performing daily tasks.
- Requirements Workshops: Gather multiple users to design application requirements.
- Brainstorming
- Questionnaires
- Role-Playing: Development team simulates user tasks.
- Prototypes
Steps to Gathering Requirements
Step 1: Define the Problem
Define, agree on, and understand the problem.
Step 2: Identify Stakeholders
Stakeholders are anyone affected by system implementation.
Step 3: Define System Boundaries
Define the boundary between the software and interacting elements.
Step 4: Identify Needs
Requirements discovery often starts by studying application needs, providing an overview of the problem.
Step 5: Define Features
Specific functions and properties the system must have, expressed in simple sentences from users.
Step 6: Define Requirements
Expand features into detailed requirements.
- Functional Requirements: Describe system functionality, inputs, outputs, exceptions, etc.
- Non-Functional Requirements: System properties like usability, reliability, performance (UFRM).