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).