Introduction to Software development - unit 1
Introduction to Software development - unit 1
What is software?
Software is a collection of instructions or programs that direct a computer on what tasks to
perform, making it programmable and enabling it to execute specific functions.
The goal of software development is to create a product that meets user needs and business
objectives in an efficient, repeatable and secure way. System analysts, Software developers,
programmers and software engineers, AI Engineers develop software through a series of steps
called the software development lifecycle (SDLC).
Types of software
Types of software include system software, programming software, application software and
embedded software:
1. System software
Is the foundational layer of software that allows hardware to communicate with
software. It manages hardware resources and provides essential services for other types
of software.
Examples
1 CS 130
• Utility Software: Disk cleanup tools, antivirus programs, file management
systems.
• Hardware Management: Device drivers for printers, graphics cards, or network
adapters.
2. Programming software
Provides tools for developers to write, test, and debug code. It helps create all the other
types of software.
Examples
3. Application software
Helps users perform specific tasks, such as writing documents, playing music, or
browsing the web.
Examples
4. Embedded software
Is designed to run on specific devices that are not traditional computers. It enables
these devices to perform specific tasks, often in real-time, and is usually embedded
directly into the hardware.
Examples
2 CS 130
Who develops software?
Programmers, software engineers, system analysts, software developers, and AI engineers
primarily conduct software development. These roles interact, overlap, and have similar
requirements, such as writing code, testing software, developing Large language models and
ensuring functionality align with business goals. The dynamics between them vary greatly
across development departments and organizations.
Programmers (coders)
Programmers, or coders, write source code to program computers for specific tasks such as
merging databases, processing online orders, routing communications, conducting searches or
displaying text and graphics. They also debug and test software to make sure the software does
not contain errors.
Programmers typically interpret instructions from software developers and engineers and use
programming languages such as PHP, C++, Java™, JavaScript and Python to implement them.
Software engineers
Software engineers design, develop, test and maintain software applications. As a managerial
role, software engineers engage in problem solving with project managers, product managers
and other team members to account for real-world scenarios and business goals. Software
engineers consider full systems when developing software, making sure that operating systems
meet software requirements and that various pieces of software can interact with each other.
Beyond the building of new software, engineers monitor, test and optimize applications after
they are deployed. Software engineers oversee the creation and deployment of patches, updates
and new features.
Software developers
Like software engineers, software developers design, develop and test software. Unlike
engineers, they usually have a specific, project-based focus. A developer might be assigned to
fix an identified error, work with a team of developers on a software update or to develop a
specific aspect of a new piece of software. Software developers require many of the same skills
as engineers but are not often assigned to manage full systems.
3 CS 130
AI Engineers
AI engineers specialize in designing, developing, and deploying artificial intelligence and
machine learning systems. Their work often involves creating models that can analyze large
amounts of data, make predictions, or automate complex tasks. AI engineers use programming
languages such as Python, R, and Java, as well as specialized frameworks like TensorFlow,
PyTorch, or Scikit-learn. AI engineers work closely with data scientists, software engineers, and
product managers to ensure that AI systems integrate seamlessly into larger software solutions.
They focus on optimizing model performance, ensuring scalability, and addressing challenges
like data preprocessing, bias, and explainability.
System Analyst
Act as the critical link between business needs and technology solutions, analyzing
organizational workflows to design efficient IT systems. They gather stakeholder requirements,
model processes using tools like UML and flowcharts, and translate these into technical
specifications for developers. Collaborating with business teams, engineers, and end-users,
they ensure systems align with operational goals while addressing challenges like integration,
scalability, and cost-effectiveness. Their expertise bridges gaps between non-technical
stakeholders and development teams, optimizing systems to drive productivity and innovation.
Summary Table
1. Planning
The planning phase is the foundation of any successful software development project.
Project goals, objectives, and requirements are gathered and documented during this
phase. Project requirements can be based on customer feedback or market research
evaluating existing product options. Stakeholders work together to define the project
scope, establish timelines, and allocate resources. Planning establishes the project's
direction, ensuring that all participants have a clear understanding of what needs to be
done and how to achieve it.
2. Feasibility analysis
Once planning is complete, the feasibility analysis phase begins. During this phase, the
project team evaluates whether the project is technically and financially viable. This
includes assessing the technical requirements, estimating costs, and performing a risk
analysis. Risk assessment is essential to identifying potential challenges and
determining if the project is worth pursuing.
5 CS 130
3. System design
The system design phase includes creating the software's architecture and design. Based
on the requirements gathered during planning, the team creates a blueprint outlining
how the software will function. This includes high-level architecture and detailed
design specifications, including user interface design to ensure the software is user-
friendly and an assessment of requirements for compatibility with existing products.
4. Implementation
The implementation phase, also known as the development phase, transforms the
design into a functional application. It is here that the actual coding takes place.
Developers write the code based on the design specifications, following best practices
and coding standards to ensure the result is efficient, secure, and maintainable.
5. Testing
The testing phase is critical because it generates essential performance and usability
feedback while revealing defects and quirks. Various types of software testing can be
used, including automated testing, unit testing, integration testing, and system testing. The
goal is to identify and fix bugs, ensuring the software operates as intended before being
deployed to users.
6. Deployment
Once internal software testing is complete, the solution can be deployed to end users.
This typically includes a beta-testing phase or pilot launch, limited to a select group of
real-world users. Depending on the project's needs, deployment can be done on-
premise or in the cloud. The deployment strategy determines how easily users can
access and use the software.
7. Maintenance
The last phase of the SDLC is maintenance. Even after the software is deployed, ongoing
support is necessary to address issues, apply updates, and add new features. Continuous
maintenance ensures that the software remains functional and relevant over time.
6 CS 130
Systems Theory and the Nature and Behavior of Information
Systems
Introduction to Information Systems
An Information System (IS) is a structured arrangement of hardware, software, data, people,
and processes that work together to collect, process, store, and distribute information.
Organizations rely on ISs to support decision-making, coordinate activities, and enhance
operational efficiency.
Information Systems are critical in various fields, including business, healthcare, education,
and government, as they enable efficient resource management, improve communication, and
provide a competitive edge. For example, in healthcare, ISs manage patient records, streamline
appointments, and support diagnostic processes, while in business, they facilitate supply chain
management, customer relationship management (CRM), and financial analysis.
7 CS 130
Example: A university’s online learning management system (LMS) allows students
and faculty to exchange information, submit assignments, and access educational
materials. The LMS interacts with external systems like email servers and cloud
storage.
b) Closed Systems
• Closed systems operate independently, with minimal interaction with external
elements.
• They rely primarily on internal processes without external inputs affecting their
behavior.
Key Characteristics
Most modern Information Systems are open systems, as they require interaction with users,
external databases, and other systems to function effectively. However, certain subsystems
within an IS (e.g., a backup server) may operate as closed systems for security or stability
reasons.
8 CS 130
It includes: System software: Operating systems (e.g., Windows, Linux) that manage
hardware resources, Application software: Programs designed for specific tasks, such
as business applications, enterprise resource planning (ERP) systems, or customer
relationship management (CRM) tools.
Importance - Software defines the functionality of the system and determines how data
is processed and presented.
3. Data
The raw facts and figures processed by the system to generate meaningful information.
Examples include customer records, financial transactions, and student performance
data.
Importance: Data is the foundation of any IS. Effective data management, including
storage, retrieval, and analysis, is crucial for decision-making.
4. People
The users who interact with the system, including IT professionals, business managers,
employees, and customers. IT professionals design, implement, and maintain the
system and End-users (e.g., employees, customers) interact with the system to perform
tasks.
Importance - People are essential for designing, operating, and maintaining the system.
User training and support are critical for maximizing the system's effectiveness.
5. Processes
The structured workflows and rules followed within the system to achieve business
objectives. Examples include order processing in an e-commerce system or payroll
management in a corporate environment.
Importance - Processes ensure consistency, efficiency, and compliance with
organizational goals. Well-defined processes reduce errors and improve productivity.
Each of these components must work together efficiently to ensure the successful operation of
an Information System. For example, in an e-commerce platform, hardware (servers) and
software (web applications) process customer orders, while people (customers and employees)
interact with the system, and processes (order fulfillment workflows) ensure timely delivery.
9 CS 130
• Input - The system receives data from users or external sources (e.g., customer
orders, sensor data).
• Processing - The data is processed based on predefined rules and logic (e.g.,
calculating totals, generating reports).
• Output - The system generates meaningful information for decision-making
(e.g., invoices, dashboards).
Example: A banking system processes customer transactions (input), updates account
balances (processing), and generates account statements (output).
b) Feedback Mechanisms
• Information Systems incorporate feedback loops to improve performance.
• Users can provide input that allows the system to adjust processes dynamically.
Example: A customer relationship management (CRM) system may adjust marketing
strategies based on customer feedback and purchase behavior. For instance, if
customers frequently abandon their shopping carts, the system might trigger
personalized discount offers.
c) Adaptability and Scalability
• Effective ISs can evolve with changing business needs and technological
advancements.
• Adaptability: The ability to modify processes or integrate new technologies
(e.g., adopting AI for data analysis).
• Scalability: The ability to handle increased workloads without performance
degradation (e.g., cloud-based systems that scale resources based on demand).
Example: A cloud-based e-commerce platform can scale its server capacity during peak
shopping seasons to handle increased traffic.
d) Interdependence of Components
• The components of an IS are interdependent, meaning changes in one
component can affect others.
Example: Upgrading software may require hardware upgrades to maintain
performance, or changes in processes may necessitate user training.
e) Security and Reliability
• ISs must ensure data security and system reliability to maintain user trust and
operational continuity.
Example: Encryption, firewalls, and backup systems are implemented to protect
sensitive data and ensure system availability.
10 CS 130
Practical Applications of Systems Theory in IS
Systems theory provides a powerful framework for working with Information Systems (IS) by
emphasizing holistic understanding and component interactions. In system design, this theory
guides the effective integration of hardware, software, data, people, and processes, ensuring all
elements work cohesively to meet organizational objectives. Rather than treating these
components in isolation, systems theory enables designers to create architectures where each
part contributes to the overall functionality and goals of the system.
When issues arise, systems theory proves invaluable for troubleshooting. IT professionals can
diagnose problems more effectively by analyzing how components interact, rather than
examining parts individually. For example, a performance bottleneck might stem not from a
single piece of hardware, but from the interplay between database structures, network
configurations, and user behavior patterns. This systemic perspective leads to more accurate
problem identification and sustainable solutions.
Beyond problem-solving, systems theory drives continuous optimization of Information
Systems. By examining workflows, data flows, and feedback loops, organizations can identify
inefficiencies and opportunities for improvement. A systemic view might reveal, for instance,
that automating a manual process between two departments could enhance throughput while
reducing errors. Such optimizations are only possible when the IS is understood as an
interconnected whole, where changes to one element may impact others in predictable ways.
11 CS 130
Division Traditional Function Modern IS Shift
Advanced cybersecurity
frameworks (e.g., Zero
Security & Ensuring data integrity, access control,
Trust), GDPR/ISO compliance,
Compliance and regulatory compliance.
and AI-based threat detection
systems.
Business
Real-time dashboards, predictive
Intelligence Generating static reports and basic
analytics, and AI-driven
(BI) & Data data analysis.
insights (e.g., Tableau, Power BI).
Analytics
12 CS 130
Object Oriented Systems
Object-Oriented Programming (OOP) is a programming paradigm that structures software
design around objects rather than functions and logic. It emphasizes four key principles:
encapsulation, inheritance, polymorphism, and abstraction.
Introduction to UML
UML is a standardized visual language for modeling software systems, using diagrams to
represent both structure (like classes and objects) and behavior (like interactions and
processes). It helps teams visualize, design, and document systems clearly before coding,
ensuring better communication between stakeholders and developers. Key diagrams include
class diagrams (system structure), use case diagrams (user requirements), sequence diagrams
(object interactions over time), and state diagrams (behavior changes). UML simplifies
complexity and serves as a blueprint throughout the software development lifecycle.
Class Diagrams
A class diagram is a visual representation of a system’s structure using classes, their attributes,
methods, and relationships. It is useful in designing and understanding object-oriented systems.
A class diagram consists of a class box, which is divided into three sections:
• Class Name: The top section (e.g., Car).
• Attributes: The middle section, listing properties such as color: String and model:
String.
• Methods: The bottom section, containing behaviors like accelerate() and brake().
Class diagrams also illustrate relationships between classes:
• Inheritance: Represents a hierarchical relationship, where a Car is a type of Vehicle.
• Association: Shows a connection between two classes, such as a Car having an Engine.
• Aggregation/Composition: Represents a whole-part relationship, such as a Library
containing Books.
13 CS 130
Class Responsibility Collaborator (CRC) Cards
CRC cards are a simple design tool used for brainstorming and organizing classes, their
responsibilities, and collaborations. Each card represents a class and contains three key
elements:
• Class Name: Identifies the class.
• Responsibilities: Lists the actions or methods the class performs.
• Collaborators: Indicates other classes the class interacts with.
CRC cards help in the initial stages of system design by ensuring that responsibilities are clearly
defined and relationships between classes are well-structured.
Object Diagrams
An object diagram provides a snapshot of the system at a specific point in time, displaying
objects and their relationships. Unlike class diagrams, which focus on general structures, object
diagrams emphasize specific instances of classes.
An object diagram includes an object box, which follows the format objectName: ClassName
(e.g., myCar: Car). It also shows attributes, representing the object's current state, such as
color = red and model = SUV. Additionally, links between objects illustrate relationships,
similar to associations in class diagrams.
Collaboration diagrams
Collaboration diagrams (also called communication diagrams) are UML interaction diagrams
that show how objects work together to achieve a specific task or use case. They focus on:
14 CS 130
1. Objects (instances of classes) and their roles
2. Messages (method calls) exchanged between objects
3. The sequence of interactions (numbered to indicate order)
Sequence diagrams
Sequence diagrams are UML interaction diagrams that visualize how objects communicate
over time to achieve a specific scenario. They emphasize:
1. Lifelines (objects participating in the interaction)
2. Messages (method calls) shown as arrows between lifelines
3. Time flow (vertical axis) to clarify the exact order of operations
State diagrams
State diagrams (or state machines) model how an object's behavior changes based on its internal
state. They capture:
1. States (e.g., `Idle`, `Processing`, `Locked`)
2. Transitions (triggered by events, like timeouts or user actions)
3. Actions (e.g., "on entry/exit" behaviors)
For instance, a `TrafficLight` object’s state diagram would cycle through:
`Green → (timer expires) → Yellow → (timer expires) → Red`
15 CS 130
Used late in design, state diagrams clarify complex, state-dependent logic (e.g., UI flows,
device controllers).
Programming paradigms
What is a Programming Paradigm?
A programming paradigm is a way of organizing and structuring code based on specific
principles and problem-solving approaches. Different paradigms exist because they are suited
to different types of problems. As technology evolves, new paradigms emerge to improve
efficiency and flexibility in programming. Additionally, programming is a creative field where
developers refine and adapt methods, leading to various paradigms that offer different ways to
design and write code.
Imperative Programming
Imperative programming is a style where we give the computer step-by-step instructions on
what to do and in what order. It focuses on how a task is performed by explicitly defining each
step.
For example, if we were baking a cake using an imperative approach, our instructions might
be:
1. Add flour to a bowl.
16 CS 130
2. Add eggs and milk.
3. Mix the ingredients.
4. Pour into a mold.
5. Bake for 35 minutes.
6. Let it cool.
Each step is clearly defined, just like in imperative programming.
In programming, suppose we want to filter a list to keep only numbers greater than 5. Using
pseudo-code, an imperative approach would look like this:
nums = [1, 4, 3, 6, 7, 8, 9, 2]
result = []
Here, we explicitly tell the program to loop through the list, check if each number is greater
than 5, and store the valid numbers in a new list. This step-by-step control is what defines
imperative programming.
Procedural Programming
Procedural programming is a type of imperative programming that organizes code into reusable
functions (also called procedures or subroutines). This approach improves modularity and
makes programs easier to read and maintain.
Using our cake example, procedural programming would divide the steps into functions:
FUNCTION pourIngredients()
- Add flour to a bowl
- Add eggs and milk
END FUNCTION
FUNCTION mixAndTransferToMold()
- Mix the ingredients
- Pour the mixture into a mold
END FUNCTION
FUNCTION cookAndLetChill()
17 CS 130
- Bake for 35 minutes
- Let cool
END FUNCTION
pourIngredients()
mixAndTransferToMold()
cookAndLetChill()
Here, instead of listing every step in a long sequence, we organize tasks into separate functions.
By just looking at the function calls at the end, we get a clear idea of what the program does
without needing to read every detail.
Procedural programming still follows an imperative approach, but it improves structure and
reusability by breaking tasks into smaller, more manageable parts.
Functional Programming
Functional programming builds on the concept of functions but takes it further by treating
functions as first-class citizens. This means functions can be assigned to variables, passed as
arguments, and returned from other functions.
A key principle in functional programming is the use of pure functions. A pure function:
• Depends only on its inputs.
• Always produces the same output for the same input.
• Does not cause side effects (i.e., it doesn’t modify anything outside its scope).
This approach improves modularity, makes code easier to maintain, and helps separate
responsibilities within a program.
Consider the problem of filtering numbers greater than 5. An imperative approach might use
an external variable, causing a side effect:
nums = [1, 4, 3, 6, 7, 8, 9, 2]
result = [] // External variable
FUNCTION filterNums(numbers)
result = [] // Internal variable
18 CS 130
FOR each num IN numbers DO
IF num > 5 THEN
ADD num TO result
END IF
END FOR
RETURN result
END FUNCTION
Here, the function filterNums does not modify any global variables. It takes an input, processes
it, and returns a new result without affecting anything outside its scope. This makes functional
programming more predictable, reducing unintended side effects and improving code
maintainability.
Declarative Programming
Declarative programming focuses on describing what the program should do rather than how
to do it. It hides complexity and makes code more readable by bringing it closer to human
thinking. Unlike imperative programming, where we give step-by-step instructions, declarative
programming lets us specify the desired outcome without detailing the process.
For example, if we want to filter numbers greater than 5, an imperative approach would require
looping through the array and storing values manually. A declarative approach simplifies this:
nums = [1, 4, 3, 6, 7, 8, 9, 2]
PRINT FILTER(nums, num => num > 5) // Output: [6, 7, 8, 9]
Here, we don’t write a loop or manage an extra array. We just declare that we want to "filter"
numbers based on a condition, and the system handles the logic internally. Even though
declarative code looks simple, the computer still processes it using imperative instructions
internally. Declarative programming just hides that complexity, making code easier to read,
write, and maintain.
19 CS 130
In OOP, we define classes as blueprints for creating objects. Each object is an instance of a
class. The idea is to separate different concerns into distinct objects, each responsible for certain
tasks.
Let's consider our bakery example again, with a main cook (Frank) and an assistant cook
(Anthony), but this time we’ll simplify the example by omitting constructors.
CLASS Cook
METHOD mixAndBake()
- Mix the ingredients
- Pour the mix in a mold
- Cook for 35 minutes
END METHOD
END CLASS
CLASS AssistantCook
METHOD pourIngredients()
- Pour flour in a bowl
- Pour a couple eggs in the same bowl
- Pour some milk in the same bowl
END METHOD
METHOD chillTheCake()
- Let chill
END METHOD
END CLASS
In this example, we have two classes: Cook and AssistantCook. Each class defines methods for
specific tasks like mixing, baking, and pouring ingredients. We create instances of each class
(Frank and Anthony) and call the appropriate methods for each one.
By using OOP, we separate responsibilities into objects, making the code easier to understand
and maintain.
Design Paradigms
A design paradigm refers to a general approach or methodology used to structure and organize
software design. It provides guidelines for solving problems and building systems by focusing
20 CS 130
on specific principles, patterns, and practices. Different design paradigms can influence the
architecture, development process, and overall structure of a software system.
One example of a design paradigm is MVC (Model-View-Controller). This design pattern is
commonly used to separate the concerns of an application into three interconnected
components:
• Model: Represents the data and business logic of the application.
• View: The user interface that displays data from the model.
• Controller: Handles user input, updates the model, and passes data to the view.
We will explore MVC and other design paradigms in more detail in a later chapter, where we
will delve into how these paradigms shape the design and development of software systems.
21 CS 130
the system should accomplish by illustrating interactions between actors and key
functionalities. During system design, these diagrams are refined to specify detailed
workflows, ensuring all user scenarios are accounted for before development begins. In
maintenance, use case diagrams are revisited when extending or modifying system features,
such as adding new user roles or updating existing processes to meet evolving business needs.
Their role in clarifying system boundaries makes them essential for both initial design and
future adaptations.
Class Diagrams
Class diagrams serve as the structural backbone of the system and are central to the system
design phase. They define the relationships between classes, their attributes, and methods,
providing developers with a blueprint for implementation. During implementation, these
diagrams guide the actual coding process, ensuring classes are correctly instantiated and
interact as intended. In maintenance, class diagrams are critical for refactoring or extending the
system such as introducing new subclasses or modifying existing hierarchies while maintaining
consistency with the original design. Their ability to represent the system’s architecture makes
them indispensable for long-term scalability.
Object Diagrams
Object diagrams are used during implementation to validate that runtime object instances
adhere to the structure defined by class diagrams. They provide a snapshot of the system’s state
at a specific moment, helping developers debug issues related to object initialization or attribute
values. In maintenance, these diagrams assist in diagnosing runtime problems, such as
unexpected null references or incorrect object relationships, by comparing actual instances
against expected configurations. While less commonly maintained long-term, their utility in
troubleshooting makes them valuable during both development and post-deployment fixes.
Sequence Diagrams
Sequence diagrams are crucial in system design for modeling time-sensitive interactions
between objects, such as API calls or user workflows. They ensure that critical processes, like
authentication or transaction sequences, are logically sound before coding begins. During
testing, these diagrams serve as a reference to verify that messages between objects occur in
the correct order and with the expected inputs/outputs. In maintenance, they help trace failures
in production by isolating where a process breaks down—for example, identifying a missing
response in a payment gateway integration. Their focus on temporal logic makes them vital for
debugging complex interactions.
Collaboration Diagrams
Collaboration diagrams emphasize object relationships rather than strict timing, making them
particularly useful during system design to visualize how components collaborate to achieve a
use case. They complement sequence diagrams by highlighting structural dependencies, such
as which objects are responsible for specific tasks. In testing, collaboration diagrams validate
whether objects interact as intended, exposing flaws like circular dependencies or missing
links. During maintenance, they aid in resolving issues where objects fail to communicate
22 CS 130
correctly after updates for instance, when a new module disrupts existing collaborations. Their
structural perspective ensures robust system integration.
State Diagrams
State diagrams are employed in system design to define behavior tied to an object’s internal
state, such as a user account’s lifecycle (e.g., active, locked, or inactive). They clarify
transitions triggered by events, ensuring all edge cases are considered upfront. In testing, these
diagrams validate whether objects transition between states correctly for example, confirming
that a failed login attempt increments a counter and eventually locks the account. During
maintenance, state diagrams are updated to address bugs like stuck states or unintended
transitions, often caused by new requirements or patches. Their precision in modeling stateful
logic is key to maintaining system reliability.
Why Some Phases Are Unmarked
Feasibility analysis focuses on technical and financial viability, not design specifics, so UML
diagrams are irrelevant at this stage. Deployment involves infrastructure and release
management, which are operational tasks rather than design concerns. Testing is only mapped
to dynamic diagrams (sequence, collaboration, state) because they model behavior that can be
directly validated against test cases. Static diagrams (class, object) are not tested but serve as
references for testers. This selective mapping ensures each diagram’s use aligns with its
strengths in the SDLC.
Maintenance: A Living Process
Unlike other phases, maintenance is iterative and relies on most of the UML diagrams.
Diagrams are updated to reflect changes, acting as documentation for future developers. For
example, a new feature might require updates to use cases, class structures, and state logic
simultaneously. This ongoing use prevents documentation drift and ensures the system’s design
remains accurate throughout its lifecycle.
23 CS 130
• API Development - Involves designing and implementing application programming
interfaces (APIs) that allow different software systems to communicate with each
other.
• Web App Development - Involves building applications that run in web browsers,
often combining frontend, backend, and API development to create interactive and
dynamic online tools.
• Code editors
Code editors are lightweight tools designed for writing and editing code. They
are fast, customizable, and often support multiple programming languages. Eg
VsCode, atom, sublime text.
24 CS 130
• Testing tools
Facilitate automated and manual testing of software to ensure it meets quality
standards. Tools range from unit testing to performance testing frameworks.
E.g. Selenium, Postman, PHPUnit
25 CS 130
Study Questions
Approach 1 (Imperative)
temperatures = [25, 31, 29, 33, 28]
hot_days = []
26 CS 130
Approach 2 (Declarative)
temperatures = [25, 31, 29, 33, 28]
PRINT FILTER temperatures WHERE temp > 30 // Output: [31, 33]
27 CS 130