Software Engineering vs Programming
Before we study software engineering in depth, it is important to distinguish between a program and software. The difference looks small in everyday speech, but it is fundamental for an engineering view of software systems.
Programming focuses on coding individual programs, while software engineering covers the complete process: requirements, design, implementation, testing, deployment and maintenance.
What Is a Program?
A program is a set of instructions written in a programming language that a computer can execute. Typically, a program:
- Has a clear starting point (for example, the
main()function in C/C++ or Java). - Takes input, performs computations or other operations, and produces some output.
- Focuses mainly on the executable logic.
For example, a short C program that reads two numbers and prints their sum is a program. Even if it is only a few lines long, it is still a valid program.
What Is Software?
Software is a broader term. It usually refers to a program or a collection of programs together with all the supporting artefacts that make it usable, installable and maintainable. These artefacts are designed as a whole to perform a specific task or provide a service.
Typical components of software include:
- One or more executable programs.
- Libraries or modules used by those programs.
- Configuration files.
- User documentation (user manuals, help files, online help).
- Developer documentation (design documents, code comments, API documentation).
A calculator application, for example, may include:
- The main calculation logic (program).
- A graphical user interface (buttons, display, error messages).
- Help files or user instructions.
Taken together, these elements form a software product.
Key idea: Every program is part of software, but when we say software in software engineering, we usually mean the complete product – not just the raw code.
Why Is Software Important?
Software is now a critical asset for individuals, organisations and nations:
- The economies of all developed nations (and many developing ones) depend heavily on software for banking, communication, transport, education, governance and more.
- A growing number of systems in military, industrial, medical, educational and entertainment domains are software-controlled.
- Expenditure on software development, maintenance and related services forms a significant portion of the Gross National Product (GNP) in many countries.
Because of this, the way we design, build, test, deploy and maintain software has a direct impact on reliability, safety, security and cost at national and global levels. Software engineering provides the principles and practices needed to manage this impact responsibly.
Attributes of Good Software
A good software product is not judged only by whether it “works”. It must also satisfy a set of broader quality expectations from its users and stakeholders.
In practice, software is expected to be:
- Functionally correct.
- Efficient in its use of resources.
- Easy to maintain and evolve.
- Safe and secure to use.
- Acceptable and usable for its intended users.
These characteristics are often called software quality attributes or non-functional requirements.
Essential Quality Attributes of Good Software
Maintainability
Software should be designed so that it can be easily modified and extended. As user needs, business rules or technology change, developers should be able to fix defects, add new features and adapt the system without excessive cost or risk.
Efficiency
Efficient software uses system resources judiciously — including processor time, memory, disk space and network bandwidth. It performs its tasks without unnecessary delays or overhead, which is especially important for large-scale, interactive or real-time systems.
Acceptability (Usability and Compatibility)
The software must fit well into the user’s working environment. In particular, it should be:
- Understandable: users can learn how to use it without excessive training.
- Easy to use: the interface and workflows are intuitive and user-friendly.
- Compatible: it works correctly with other systems, platforms and tools that users rely on.
Correctness
Correct software performs its intended functions accurately, according to the specification. For valid inputs, it produces the expected outputs and behaves as defined in the requirements.
Portability
Portable software can be moved from one environment to another (for example, from Windows to Linux, or from on-premise servers to the cloud) with minimal changes. This is usually achieved by avoiding platform-specific features or isolating them inside well-defined modules.
Cost-effectiveness
Software should be developed and maintained in a cost-effective manner. This requires balancing:
- Required quality and functionality.
- Time-to-market or delivery deadlines.
- Available budget and human resources.
Security
Secure software protects data and services against unauthorised access or misuse. Only authorised users should be able to access sensitive functions and information. Security also includes resistance to attacks, protection of privacy and safe handling of errors.
In practice: software engineering is largely about managing trade-offs between these attributes, based on the priorities of users and stakeholders. Improving one attribute (for example, performance) may increase cost or reduce maintainability, so careful design decisions are essential.