Software Engineering Principles and Practices / Introduction to Software Engineering

Characteristics of Good Software

A professional software product is judged by more than just its functionality. We use the McCall’s Quality Model and modern standards to define what makes software "good."


🏛️ The 4 Pillars of Software Quality

1. Operational Characteristics (How it runs)

These are the traits visible while the software is actually in use.

  • Correctness: Does the software do exactly what it’s supposed to do? (Zero defects).

  • Efficiency: Does it use the minimum amount of CPU, memory, and battery possible? 🔋

  • Reliability: Does it work consistently without crashing under normal conditions?

  • Security: Is the data protected from unauthorized access or external "hacks"? 🛡️

  • Usability: Can a human understand the interface without a 500-page manual?


2. Revision Characteristics (How it changes)

Since software is never "finished," how easy is it to update?

  • Maintainability: Can a new developer read the code and fix a bug easily?

  • Flexibility: How hard is it to add a new feature without breaking old ones?

  • Testability: Is the code written in a way that automated tests can verify it?


3. Transition Characteristics (How it moves)

Can this software live in different environments?

  • Portability: Can it run on Windows, Mac, and Linux without a total rewrite?

  • Reusability: Can parts of the code be used to build a different app later?

  • Interoperability: Does it play nice with other software (e.g., via APIs)?


4. The "Hidden" Pillar: Documentation

  • Completeness: A product isn't "good" if the engineers are the only ones who know how it works. Good software includes clear documentation for both users and future developers.


⚖️ The Quality Trade-off Triangle

In the real world, you often cannot have 100% of every characteristic. Software Engineering is the art of balancing these:

⚠️ Example: If you make a software extremely Secure (multiple logins, encryption), you might decrease its Usability (it becomes annoying for the user).

If you prioritize...

You might lose...

Speed (Efficiency)

Readability (Maintainability)

Complex Features

Reliability (More bugs)

Tight Security

User Convenience


📝 Summary for "Good" Software

  • Functional: It solves the user's problem.

  • Non-functional: It is fast, secure, and reliable.

  • Evolutionary: It can grow and change over time without collapsing.

  • Economical: It was built within a reasonable budget and timeframe.