Defining Software and Software Engineering Study Guide
Software and Software Engineering Foundations
Definition of Software:
- Software consists of instructions (computer programs) that execute when provided with appropriate input to perform desired functions and performance.
- Software operates in a dual role:
- It is a product in itself.
- It serves as a vehicle for delivering a product.
Definition of Engineering:
- Engineering is centered on developing products using well-defined scientific principles and methods.
- It relies on the structured use of tools, techniques, and methods.
Definition of Software Engineering:
- The application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software [IEE93].
- The establishment and use of sound engineering principles in order to obtain economically built software that is reliable and works efficiently on real machines.
Role of a Software Engineer:
- A software engineer is a skilled professional who applies a broad range of application development knowledge to the systematic development of application systems for organizations.
- Software engineers strive to deliver a high-quality software product while ensuring a high-quality development process.

Software Application Domains
1. System Software:
- A collection of programs written to service other programs.
- Examples include compilers, text editors, file management utilities, operating system components, hardware drivers, networking software, and telecommunications processors.
2. Application Software:
- Stand-alone programs designed to solve specific business needs, supporting operational activities and management or technical decision-making.
3. Engineering/Scientific Software:
- Software written for specific domain applications utilizing principles, techniques, and formulas tailored to distinct scientific and engineering fields.
- Fields of application include astronomy, volcanology, automotive stress analysis, computer-aided design (CAD), genetic analysis, and related disciplines.
4. Embedded Software:
- Specialized programming placed inside a chip or firmware in an embedded device to control its specific functions.
- Hardware manufacturers use embedded software to manage device operations (e.g., keypad control for a microwave oven or digital functions within modern automobiles).
5. Product-Line Software:
- Software designed to provide a specific capability intended for widespread use across different customers (e.g., inventory control systems).
6. Web/Mobile Applications:
- Mobile Web applications refer to applications designed for mobile devices that require only a Web browser installed on the device to function.
- Examples include UberApp, Talabat, Amazon.com, and Alibaba.com.
7. Artificial Intelligence Software:
- Software capable of demonstrating intelligent behavior by simulating human cognitive capabilities.
- Key simulated capabilities include reasoning, learning, problem solving, perception, and knowledge representation.
- Examples include robotics, expert systems, pattern recognition (image and voice processing), and artificial neural networks.
Fundamental Skills of a Software Engineer
- Core Technical and Management Competencies:
- Knowing how to select appropriate computer programming languages and develop computer programs.
- Knowing how to identify, evaluate, choose, and implement an appropriate methodology along with Computer-Aided Software Engineering (CASE) tools.
- Knowing how and when to utilize prototyping in the development life cycle.
- Knowing how and when to select appropriate hardware and software platforms.
- Managing activities associated with configuration management, project planning, and execution control of the development process.
- Determining which project testing techniques to apply and how to execute them effectively.
- Selecting and implementing appropriate software maintenance techniques.
- Evaluating software applications to decide when they should be retired from service.
Need for Software Engineering
Evolving User Requirements:
- The demand for software engineering arises directly from the higher rate of user requirements evolving within diverse working environments.
Software Complexity and Scale (Large Software):
- Building simple code is analogous to constructing a wall, whereas building large software systems is analogous to constructing a complex building or house.
- As the size of software increases—measured by the number of lines of code—engineering discipline must step in to provide a structured, scientific process.
Scalability Requirements:
- Scalability refers to the ability of software to change in size.
- It involves expanding software capacity and functionality dynamically based on user demand.
Cost Dynamics:
- Advances in hardware manufacturing have consistently lowered the price of electronic hardware.
- Conversely, the cost of software remains high unless systematic engineering methodologies are applied to optimize development.
Dynamic Nature of Software:
- Software is inherently subject to continuous change.
- New enhancements must regularly be integrated into existing codebases to accommodate ongoing changes in user requirements.
Quality Management:
- Adopting a structured software development process directly improves software product quality and operational reliability.
Software Engineering Ethics and Professional Practice
Professional Responsibilities:
- Software engineers must recognize that their professional duties extend beyond technical skill execution to include ethical and morally responsible conduct.
- Engineers must not apply their skills dishonestly or act in ways that bring disrepute to the profession.
Key Ethical Rules:
- Confidentiality: Engineers must respect the confidentiality of employers and clients regardless of whether a formal non-disclosure agreement was signed.
- Competence: Engineers must not misrepresent their actual level of competence and must not knowingly accept work that falls outside their area of expertise.
- Intellectual Property Rights: Engineers must maintain awareness of local laws governing patents and copyrights and actively protect client/employer intellectual property.
- Computer Misuse: Engineers must never use their technical skills or access privileges to misuse or compromise computer systems.
ACM/IEEE-CS Software Engineering Code of Ethics (Eight Principles):
- Preamble: Aspirations summarize high-level goals, while specific clauses detail actions. Aspirations and detailed clauses together form a cohesive code. Software engineers commit to making analysis, specification, design, development, testing, and maintenance a beneficial, respected profession dedicated to public health, safety, and welfare.
- 1. PUBLIC: Act consistently with the public interest.
- 2. CLIENT AND EMPLOYER: Act in a manner that serves the best interests of the client and employer, consistent with the public interest.
- 3. PRODUCT: Ensure that products and related modifications adhere to the highest professional standards possible.
- 4. JUDGMENT: Maintain independence and integrity in professional judgment.
- 5. MANAGEMENT: Software engineering managers and leaders shall subscribe to and promote an ethical approach to software development and maintenance management.
- 6. PROFESSION: Advance the integrity and reputation of the profession consistent with the public interest.
- 7. COLLEAGUES: Be fair to and supportive of colleagues.
- 8. SELF: Participate in lifelong learning regarding professional practice and actively promote an ethical approach.

Characteristics and Quality Attributes of Good Software
Operational Attributes (Performance in Operations):
- Budget: The software is fully developed within the designated financial allocation.
- Usability: The extent to which the software can be used with ease, measured by the effort or time required to learn and master it.
- Efficiency: Effective utilization of system resources, including storage space optimization and command execution within desired timing constraints.
- Correctness: The degree to which software satisfies all specifications defined by the customer.
- Functionality: The performance level of the software relative to its specified purpose.
- Dependability: Trustworthiness and reliability without causing physical or economic damage to systems.
- Security: Protection against external threats, preventing harmful effects on stored data or physical hardware.
- Safety: Guaranteeing that software operations are non-hazardous to human life and the environment.
Transitional Attributes (Platform Portability and Migration):
- Portability: Ability to perform intended functions across different operating environments and hardware platforms with minimal or no code changes.
- Interoperability: Ability to exchange data and interact transparently with other external applications.
- Reusability: Ability to reuse existing code components with minor modifications for new purposes.
- Adaptability: Capacity of the system to adjust smoothly to new operating systems or updated specifications.
Maintenance Attributes (Self-Maintenance in Dynamic Environments):
- Modularity: Construction of software using independent units/modules that can be individually modified and tested prior to system integration.
- Maintainability: Ease with which software modifications can be applied to extend functionality, correct defects, or enhance performance.
- Flexibility: Ease with which changes can be incorporated into the software.
- Scalability: Ease of upgrading software capacity to accommodate increased workload or a larger user base.
Real-Time Domain Examples:
- Banking Applications: Must emphasize high security.
- Gaming Applications: Must emphasize high interactivity and low-latency responsiveness.
- Telephone Switching Systems: Must emphasize high operational reliability and dependability.
- Registration Software: Must emphasize user-friendliness for students and administrative staff.
Software Development Life Cycle (SDLC)
- Definition of SDLC:
- A well-defined structural sequence of stages in software engineering used to design and develop an intended software product efficiently.

- Detailed SDLC Phase Activities:
- Communication:
- The initiating stage where a user submits a formal request for a software product.
- The user contacts the service provider to negotiate initial project terms and submits written specifications.
- Requirement Gathering:
- The development team conducts discussions with domain stakeholders to extract full project requirements.
- Requirements are analyzed and classified into user requirements, system requirements, and functional requirements.
- Elicitation methods include studying existing or obsolete systems, interviewing users/developers, reviewing existing databases, and distributing questionnaires.
- Feasibility Study:
- Creation of an initial rough software process plan.
- Evaluation of whether the software can fulfill user needs and avoid premature obsolescence.
- Assessment of whether the project is financially, practically, and technologically viable using standard estimation algorithms.
- System Analysis:
- Determination of the execution roadmap and selection of the optimal software lifecycle model.
- Analysis of system limitations, existing system bottlenecks, organizational impact, personnel requirements, project scope, and overall schedule.
- Software Design:
- Transformation of gathered requirement and analysis data into systematic architectural blueprints.
- Generates both Logical Design and Physical Design outputs.
- Deliverables include metadata, data dictionaries, logical diagrams, data-flow diagrams (DFDs), and pseudo-code.
- Coding (Programming Phase):
- Translation of design models into executable program code using an appropriate programming language to construct bug-free software.
- Testing:
- Testing activities account for an estimated of the total software development process.
- Early error detection prevents software degradation and critical project failure.
- Conducted by developers during coding, followed by thorough multi-level evaluation by testing experts (including module testing, program testing, product testing, in-house testing, and user-end acceptance testing).
- Integration:
- Integration of program modules with external entities, including software libraries, databases, and third-party systems.
- Implementation:
- Installation of software on target user machines, including post-installation configurations.
- Verification of adaptability, portability, and resolution of real-world integration issues.
- Operation and Maintenance:
- Ensuring smooth operational performance with reduced error rates through user training and operational documentation.
- Timely maintenance and code updating to accommodate environment and technology shifts, while mitigating hidden bugs and unexpected real-world issues.
- Disposition:
- Phase out of software as performance declines over time or systems become obsolete.
- Activities include data archiving, archiving software components, system shutdown, disposition planning, and ultimate system termination.
- Communication:
Questions & Discussion
Question 1: What is the purpose of the System Development Life Cycle? Choose the best option from the following:
- A. To build and maintain organizations
- B. To design and develop a software product
- C. To organize documents online
- D. To create an information technology framework for e-commerce
- Answer: B. To design and develop a software product
- Explanation: The core purpose of the SDLC is to provide a structured series of sequential steps to design, construct, and deliver software products efficiently.
Question 2: Identify and explain which SDLC phase is used to transform requirements into logical and physical designs?
- Answer: Software Design Phase
- Explanation: The Software Design phase takes all inputs gathered during requirement elicitation and system analysis and converts them into detailed logical designs (such as data-flow diagrams and logical diagrams) and physical designs (such as metadata, data dictionaries, and pseudo-codes).