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 Product Overview and Lifecycle

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:
    1. Knowing how to select appropriate computer programming languages and develop computer programs.
    2. Knowing how to identify, evaluate, choose, and implement an appropriate methodology along with Computer-Aided Software Engineering (CASE) tools.
    3. Knowing how and when to utilize prototyping in the development life cycle.
    4. Knowing how and when to select appropriate hardware and software platforms.
    5. Managing activities associated with configuration management, project planning, and execution control of the development process.
    6. Determining which project testing techniques to apply and how to execute them effectively.
    7. Selecting and implementing appropriate software maintenance techniques.
    8. 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:

    1. Confidentiality: Engineers must respect the confidentiality of employers and clients regardless of whether a formal non-disclosure agreement was signed.
    2. Competence: Engineers must not misrepresent their actual level of competence and must not knowingly accept work that falls outside their area of expertise.
    3. Intellectual Property Rights: Engineers must maintain awareness of local laws governing patents and copyrights and actively protect client/employer intellectual property.
    4. 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.

Software Engineering Code of Ethics and Professional Practice

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.

SDLC Stages

  • Detailed SDLC Phase Activities:
    1. 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.
    2. 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.
    3. 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.
    4. 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.
    5. 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.
    6. Coding (Programming Phase):
      • Translation of design models into executable program code using an appropriate programming language to construct bug-free software.
    7. Testing:
      • Testing activities account for an estimated 50%50\% 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).
    8. Integration:
      • Integration of program modules with external entities, including software libraries, databases, and third-party systems.
    9. Implementation:
      • Installation of software on target user machines, including post-installation configurations.
      • Verification of adaptability, portability, and resolution of real-world integration issues.
    10. 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.
    11. 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.

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