# NATURE OF  SOFTWARE
## Nature of Software - Consolidated Definitions

### Software

Software encompasses the instructions (computer programs), the organization of data (data structures), and the descriptive information that enables computer systems to perform desired functions and manipulate information effectively.

### Engineering

Engineering is the application of scientific and mathematical principles to design, test, and build machines, structures, and processes.

### Software Engineering

Software engineering is the systematic approach to the design, development, testing, and maintenance of software applications, applying engineering principles to computer science.

### Development vs. Manufacturing

Software creation is a process of development or engineering, emphasizing original design and construction rather than mass production.

### Similarities between Hardware and Software

Both hardware and software require skilled individuals, benefit from high-quality design to produce a functional product, with software costs predominantly allocated to engineering efforts.

### Software Reliability

Software's reliability stems from its design rather than physical endurance, as it does not wear out in the traditional sense.

### Failure Rate Curve

The failure rate in software is highest initially due to undiscovered defects, indicating errors in design or code translation; modifications or change requests often introduce complexities that surpass hardware maintenance.
![[Pasted image 20250326172004.png]]

# Software Application Domains


Software applications are categorized by their purpose and characteristics:

1.  **System Software:**

    *   **Focus:** Manages computer hardware and resources, providing the foundation for other applications.
    *   **Characteristics:** Heavy hardware interaction, multi-user, concurrent operations, resource sharing, complex data structures, multiple interfaces.
    *   **Examples:** Compilers, editors, OS components, drivers, networking software.

2.  **Application Software:**

    *   **Focus:** Directly addresses specific business or user needs, automating tasks and providing solutions.
    *   **Characteristics:** Controls business functions in real-time.
    *   **Examples:** Point-of-sale systems, real-time manufacturing control.

3.  **Engineering/Scientific Software:**

    *   **Focus:** Supports engineering and scientific endeavors through computation, analysis, and modeling.
    *   **Characteristics:** Complex algorithms, data analysis, simulation.
    *   **Examples:** CAD, system simulation (astronomy, biology, manufacturing).

4.  **Embedded Software:**

    *   **Focus:** Integrates into products/systems to control functions and provide specific capabilities.
    *   **Characteristics:** Limited functionality, real-time control.
    *   **Examples:** Microwave controls, washing machine controls, automotive systems.

5.  **Product Line Software:**

    *   **Focus:** Delivers specific capabilities to a broad customer base, often customizable.
    *   **Characteristics:** Can be niche or mass-market.
    *   **Examples:** Inventory control, word processing, spreadsheets, graphics, personal finance.

6.  **Web Applications:**

    *   **Focus:** Provides network-centric services and information via web browsers.
    *   **Characteristics:** Text and graphics presentation, interactive.
    *   **Examples:** E-commerce platforms, cloud services, webmail.

7.  **Artificial Intelligence Software:**

    *   **Focus:** Enables systems to perform tasks requiring human intelligence (learning, reasoning, etc.).
    *   **Characteristics:** Learning, problem-solving, pattern recognition.
    *   **Examples:** Robotics, expert systems, neural networks, chatbots.


# THE SOFTWARE PROCESS

A software process model is an abstraction of the software development process.
The models specify the stages and order of a process.
A model will define the following:
✔ The tasks to be performed.
✔ The input and output of each task.
✔ The pre and post conditions for each task.
✔ The flow and sequence of each task.
![[Pasted image 20250326181535.png]]
- **Communication:** This is a critical process for understanding stakeholder needs, gathering requirements, and ensuring everyone is aligned throughout the project.
- **Planning:** This process involves defining the scope, schedule, resources, and strategies for the software project.
- **Modelling:** This process focuses on creating representations of the software system, such as diagrams, prototypes, and specifications, to guide development.
- **Construction:** This is the core development process where the actual coding, testing, and integration of the software takes place.
- **Deployment:** This process involves releasing the completed software to the users or the production environment.

### Factors in choosing a software process
❑ Project requirements
❑ Project size
❑ Project complexity
❑ Cost of delay
❑ Customer involvement
❑ Familiarity with technology
❑ Project resources



# Software Development Life Cycle (SDLC)

![[Pasted image 20250326182338.png]]
![[Pasted image 20250326182401.png]]

![[Pasted image 20250326182346.png]]
## Agile Process: Explained

**What is it?** Agile is an **iterative and incremental** approach to software development. Unlike the Waterfall model's sequential, rigid structure, Agile emphasizes flexibility, collaboration, and continuous improvement. It breaks down projects into smaller, manageable cycles called **iterations** or **sprints**. Each sprint delivers a working piece of the software, allowing for frequent feedback and adaptation.

### **Agile Principles**(why you would use it, characteristics and etc also are the same thing)



**Emphasis:** Iterative development, customer collaboration, and responding to change.

**Key Principles:**

* **Customer Satisfaction:** Prioritize customer satisfaction through early and continuous delivery of valuable software.
* **Embrace Change:** Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
* **Frequent Delivery:** Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
* **Collaboration:** Business people and developers must work together daily throughout the project.
* **Motivated Individuals:** Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
* **Working Software:** Working software is the primary measure of progress.
* **Sustainable Pace:** Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.
* **Technical Excellence:** Continuous attention to technical excellence and good design enhances agility.
* **Simplicity:** Simplicity – the art of maximizing the amount of work not done – is essential.
* **Self-Organizing Teams:** The best architectures, requirements, and designs emerge from self-organizing teams.
* **Regular Reflection:** At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.


### **Scrum**

**What is it?** A popular Agile framework that uses short, time-boxed iterations ("Sprints") to deliver working software. Scrum emphasizes collaboration, self-organization, and iterative progress.

**Key Components:**

* **Product Owner:** Defines the product backlog (features/requirements) and prioritizes them.
* **Scrum Master:** Facilitates the Scrum process, removes impediments, and ensures the team follows Scrum practices.
* **Development Team:** Self-organizing team that builds the product.
* **Product Backlog:** A prioritized list of features and requirements.
* **Sprint Backlog:** A subset of the product backlog selected for a specific Sprint.
* **Sprint:** A short, time-boxed iteration (typically 2-4 weeks) where the team builds a working increment of the product.
* **Daily Scrum (Daily Stand-up):** A short, daily meeting for the team to synchronize progress and identify impediments.
* **Sprint Review:** A meeting to demonstrate the Sprint's increment to stakeholders and gather feedback.
* **Sprint Retrospective:** A meeting for the team to reflect on the Sprint and identify areas for improvement.

**Key Principles:**

* **Iterative & Incremental:** Progress is made in short, manageable Sprints.
* **Self-Organization:** Teams manage their own work and make decisions.
* **Collaboration:** Close teamwork between the Product Owner, Scrum Master, and Development Team.
* **Transparency:** Progress and impediments are visible to all stakeholders.
* **Inspection & Adaptation:** Regular reviews and retrospectives allow for continuous improvement.
* **Time-Boxing:** Sprints and meetings have fixed time limits.

**Why Use Scrum?**

* **Flexibility:** Adapts to changing requirements.
* **Faster Delivery:** Frequent releases of working software.
* **Improved Communication:** Daily meetings and regular reviews.
* **Increased Team Productivity:** Self-organization and focus.
* **Reduced Risk:** Early feedback and issue detection.
![[Pasted image 20250326204303.png]]

## Modelling Requirements
• The requirements for a system are the descriptions of the services
that a system should provide and the constraints on its operation.
1. User requirements are statements, in a natural language plus
diagrams, of what services the system is expected to provide to system
users and the constraints under which it must operate. The user
requirements may vary from broad statements of the system features
required to detailed, precise descriptions of the system functionality.
2. System requirements are more detailed descriptions of the software
system’s functions, services, and operational constraints. The system
requirements document (sometimes called a functional specification)
should define exactly what is to be implemented. It may be part of the
contract between the system buyer and the software developers.
![[Pasted image 20250326215008.png]]


## Requirements engineering
• Requirements engineering involves three key activities.
• These are discovering requirements by interacting with stakeholders
(elicitation and analysis);
• Converting these requirements into a standard form (specification);
• Checking that the requirements actually define the system that the customer
wants (validation).
• The broad spectrum of tasks and techniques that lead to an
understanding of requirements is called requirements engineering.
• From a software process perspective, requirements engineering is a
major software engineering action that begins during the
communication activity and continues into the modeling activity.
**Requirement Engineering encompasses 7 distinct**
**tasks:**
**Inception**
**Elicitation**
**Elaboration**
**Negotiation**
**Specification**
**Validation**
**Management**

Requirement Elicitation
• Requirements elicitation (also called requirements gathering)
combines elements of problem solving, elaboration, negotiation, and
specification.
• The aims of the requirements elicitation process are to understand the
work that stakeholders do and how they might use a new system to
help support that work.
• During requirements elicitation, software engineers work with
stakeholders to find out about the application domain, work activities,
the services and system features that stakeholders want, the required
performance of the system, hardware constraints, and so on.
![[Pasted image 20250326215139.png]]![[Pasted image 20250326223838.png]]

## **Functional vs. Non-Functional Requirements: Explained**

**Functional Requirements:**

* **What it is:** Defines *what* the system should do. They describe the specific features, behaviors, and functionalities of the software.
* **Focus:** Actions, processes, data manipulations, and user interactions.
* **Examples:**
    * "The system shall allow users to register with a valid email address and password."
    * "The system shall calculate the total price of items in the shopping cart, including tax and shipping."
    * "The system shall generate a monthly sales report in PDF format."
    * "The system shall allow administrators to add, edit, and delete product categories."
    * "The system shall send an email confirmation to the user after successful order placement."

**Non-Functional Requirements:**

* **What it is:** Defines *how* the system should perform. They describe the quality attributes, constraints, and characteristics of the system.
* **Focus:** Performance, security, usability, reliability, maintainability, and other quality aspects.
* **Examples:**
    * **Performance:** "The system shall respond to user requests within 2 seconds."
    * **Security:** "The system shall encrypt all sensitive data using AES-256 encryption."
    * **Usability:** "The system shall be accessible to users with visual impairments, adhering to WCAG 2.1 guidelines."
    * **Reliability:** "The system shall have an uptime of 99.9%."
    * **Maintainability:** "The system shall be designed with modular components for easy updates and maintenance."
    * **Scalability:** "The system shall be able to handle 10,000 concurrent users without performance degradation."
    * **Portability:** "The system shall be compatible with Chrome, Firefox, and Safari browsers."
    * **Legal:** "The system shall comply with GDPR privacy regulations."

![[Pasted image 20250326224438.png]]
Categories of Software Development Tools
**• Integrated Development Environments (IDEs)**
• IDEs provide a comprehensive platform that includes a source code editor, compiler,
debugger, and build automation tools.
• Examples: Visual Studio, IntelliJ IDEA, Eclipse, PyCharm, NetBeans
• **Version Control Systems (VCS)**
• VCS tools help developers track changes, collaborate, and maintain different versions of
software.
• Examples: Git, GitHub, GitLab, Bitbucket, Apache Subversion (SVN)
• **Debugging and Testing Tools**
• These tools assist in identifying and fixing software defects, ensuring code quality.
• Examples: JUnit, Selenium, Postman, SonarQube, PyTest, Xdebug
• **Build and Deployment Tools**
• They automate the compilation, testing, and deployment of software.
• Examples: Maven, Gradle, Jenkins, Docker, Kubernetes, Ansible
• **Database Management Tools**
• Help developers manage, query, and optimize databases.
• Examples: MySQL Workbench, PostgreSQL, MongoDB Compass, Oracle SQL
Developer
• **Collaboration and Project Management Tools**
• Facilitate team communication, task management, and project tracking.
• Examples: Jira, Trello, Asana, Slack, Microsoft Teams

![[Pasted image 20250326231847.png]]