![]() |
This section presents the most important principles and concept on which software engineering is built. |
![]() |
Principles serve as the core around which methods, procedures, plans, tools, and techniques are later built. |
![]() |
Software engineering principles are general and abstract statements describing desirable properties of |
| software products and processes. |
![]() |
They become engineering practice and customs through methods and techniques where methods and |
| techniques are packaged in a methodology and methodology can be enforced by tools. |
![]() |
In the development process of a software system, the software engineer should adhere to a number of good, |
| sound software engineering principles which, when followed, lead to the production of the desirable qualities | |
| of a software product and process. |
![]() |
Software quality includes maintainability, reusability, quality, reliability, performance, scalability, etc. |
![]() |
These principles are particularly tightly-coupled to software development tasks of designing, building and |
| deploying and maintaining reusable software components and assets. |
![]() |
Software engineering principles are also needed to overcome the many tough problems that SE faces. |
![]() |
Some of these problems include: |
![]() |
Software development cost |
![]() |
Software reliability |
![]() |
Software maintenance |
![]() |
Software productivity |
![]() |
Software reuse (reuse of specification, module, code, documents) |
![]() |
The seven principles of software engineering are: |
![]() |
Rigor and Formality |
![]() |
Separation of Concerns |
![]() |
Modularity |
![]() |
Abstraction (using a more general concept than the one that immediately comes to mind for this | |
| particular instance) |
![]() |
Anticipation of Change |
![]() |
Generality |
![]() |
Incrementality |
![]() |
Other principles of software engineering also include: |
![]() |
Strict management of phase-based life cycle. |
![]() |
Evaluation and review for each phase in Software Life Cycle. |
![]() |
Rigorous product control. |
![]() |
Use modern design techniques. |
![]() |
Review for the results in every phase. |
![]() |
Small and high-quality of development team (Chief investigator and its team). |
![]() |
Improve the practice of software engineering. |
![]() |
In the following we describe each of the above seven principles briefly. |
![]() |
Rigor and Formality are necessary for creative and systematic software systems and they increase our |
| confidence in the developed system. |
![]() |
Rigor means that each step and each product in the software process is implemented in a sound and | |
| comprehensive manner with the necessary precision. |
![]() |
Formality means that the software process is driven and evaluated by formal procedures and using | |
| mathematical laws. |
![]() |
Separation of Concerns mean that during the software process the software engineer focuses on one aspect |
| and temporarily disregards the others. |
![]() |
In other words, the software engineer deals with the different aspects of the software process separately | |
| and try to isolate aspects that are less important and not strongly related to others. |
![]() |
When the software engineer separates concerns he/she separates them in various ways including time, | |
| qualities, different views, and different parts of the system. |
![]() |
Modularity is the division of the complex software project into simpler pieces called modules. |
![]() |
The system is then called modular system. |
![]() |
A module is a small component unit of the complex system. |
![]() |
Modular design supports application of separation of concerns where each module is developed | |
| separately and independently. |
![]() |
Modular design makes the development of the software system significantly easier to understand. |
![]() |
Advantages of modularity include the capability of decomposing a complex system into simpler pieces, | |
| the capability of composing a complex system from existing module the capability of understanding a | ||
| system in terms of its pieces, and finally, the capability of modifying a system by modifying only a small | ||
| number of its pieces. |
![]() |
Abstraction is the identification of the important aspects of a phenomenon and ignoring its details. Abstraction |
| is a special case of separation of concerns. |
![]() |
Abstraction implies ignoring the details that are not so important in the correct specification of the | |
| system being developed. |
![]() |
Abstraction generates models of the proposed application. |
![]() |
The model can be a formal or semiformal description. |
![]() |
Dealing with the model in order to analyze the system instead of the system is usually sufficient for | |
| analyzing the system. |
![]() |
Anticipation of Change is the consideration of the evolution and upgrading requirements of the system being |
| developed. |
![]() |
This includes taking into account the future requirements of the developed system. |
![]() |
For software to evolve gracefully it is necessary to anticipate how and where the changes are likely to | |
| occur. |
![]() |
Anticipation of change requires the appropriate tools to be available to manage the various versions and | |
| revisions of the software in a controlled manner. |
![]() |
Generality is trying to discover if the problem being solved is an instance of a more general problem. |
![]() |
Sometimes a general problem is easier to solve than a special case. This enables the software engineer | |
| to reuse the solution of the more general system in the problem which the problem being solved. |
![]() |
A software engineer needs to balance the generality against performance and cost. |
![]() |
Incrementality is that the software process proceeds in a stepwise fashion i.e. it increments. |
![]() |
This includes the delivery of subsets of a system early to get early feedback from expected users, then | |
| adding new features incrementally, dealing first with functionality, then turning to performance and | ||
| delivery of a first prototype and then incrementally adding effort to turn prototype into product. |