Software engineering
Chapter -1
Chapter 1 Notes: Introduction - Fundamentals of Software Engineering by Rajib
Mall
1.1 Evolution—From an Art Form to an Engineering Discipline
1. Initial State - Programming as Art:
o Early software development was informal and driven by intuition.
o Styles like "build and fix" were used without formal specifications or
design.
o Success depended on individual programmer skill.
2. Transition to Craft and Engineering:
o As software complexity grew, shared practices and empirical lessons
emerged.
o Eventually, programming evolved into a structured discipline.
3. Engineering Approach Defined:
o Uses systematic, cost-effective techniques.
o Emphasizes planning, design, testing, and maintenance.
o Similar to disciplines like civil or electrical engineering.
4. Comparison with Other Fields:
o Like iron-making or paper-making, software followed the art-to-
engineering path.
o Knowledge shifted from secrets to formal documentation and
education.
5. Importance of Software Engineering:
o Helps manage complexity, improves quality, reduces cost and
development time.
1.2 Software Development Projects
1. Programs vs Products:
o Programs: Small, single-user tools developed with minimal planning.
o Products: Large-scale software for many users, with full
documentation and testing.
2. Types of Software Projects:
o Product-based: Built for mass use; e.g., Microsoft Word.
o Service-based: Custom software for specific clients.
o Outsourced: Parts of projects handled by external teams.
3. Team-Based Development:
o Requires proper planning and coordination.
o Involves roles like analysts, developers, testers, and managers.
4. Indian Software Industry:
o Excels in services; gradually moving into product development.
o Product development involves higher risks but long-term gains.
1.3 Exploratory Style of Software Development
1. Definition:
o Informal style starting with minimal briefing.
o Focuses on quick coding, followed by testing and fixing.
2. Process Flow:
o Briefing → Coding → Testing → Fixing → Repetition until acceptable.
3. Drawbacks:
o Poor maintainability and scalability.
o Exponential increase in effort as size grows.
o Unstructured and undocumented code.
4. When it's Used:
o Suitable only for small, personal projects.
5. Team Incompatibility:
o Difficult to coordinate among team members without formal
documents.
1.3.1 Perceived Problem Complexity: Human Cognition
1. Human Memory Model:
o Short-term memory: Limited capacity (7 ± 2 items).
o Long-term memory: Stores vast information over years.
2. Implications for Programming:
o Developers can't manage large systems mentally without help.
o Complexity appears to grow exponentially.
3. Why Exploratory Style Fails for Big Projects:
o Overloads cognitive limits.
o Leads to confusion, bugs, and inefficiencies.
1.3.2 Principles to Overcome Human Limitations
1. Abstraction:
o Hides details; focuses on high-level views.
o Reduces cognitive load.
2. Decomposition:
o Divides large problems into smaller sub-problems.
o Each part is easier to design, develop, and test.
3. Benefits:
o Makes complexity manageable.
o Enables teamwork and modular development.
o Effort grows linearly instead of exponentially.
1.4 Emergence of Software Engineering
1. Early Programming Era:
o Used low-level languages and lacked structured methods.
2. Milestones:
o Control Flow Design → Data Structure Design → Data Flow → Object-
Oriented Design.
3. Modern Software Design:
o Uses object-oriented and component-based designs.
o Focus on reuse, clarity, and user satisfaction.
4. Future Directions:
o Growth in AI, component reuse, and agile practices.
1.5 Notable Changes in Software Development Practices
1. Then vs Now:
o Earlier: Code-first, less planning.
o Now: Plan-design-test cycle.
2. User Involvement:
o Agile and iterative models involve users throughout development.
3. Quality Emphasis:
o Testing, verification, and documentation are critical.
4. Tools and Automation:
o CASE tools, version control, CI/CD pipelines used for efficiency.
1.6 Computer Systems Engineering
1. Definition:
o Integrates hardware and software development.
2. Application Areas:
o Embedded systems, IoT, real-time control systems.
3. Challenges:
o Requires knowledge of both electronics and software.
4. Importance:
o Essential for systems where hardware-software co-design is critical
(e.g., smartphones, vehicles).
Summary: Chapter 1 introduces software engineering as a response to rising
complexity and inefficiency in software development. It highlights its evolution,
project types, cognitive basis, and the necessity for structured practices in
modern development.