Why software is complex ?
- Complexity of the problem domain - Software is developed to solve a problem. If the problem could be solved simply and easily by human, then there is no need for a software system. So inherently the problems that have to be solved using software systems are complex. Most of the software domains that we come across are different from one another. So their requirements, available resources etc. are different. At the same time even in a particular domain, the knowledge is rapidly changing. So it’s not practical to learn in depth in a particular domain, just to develop the software.
- Impedance Mismatch - Another major reason for this complexity is the impedance mismatch. The developer of the system doesn’t know what the user really wants and the user doesn’t know how to tell what he really wants. The users and developers are having different perspectives regarding the problem and they provide different assumptions about the nature of the problem.
- Difficulty of managing the development process - If you are building a house you can see how it is being built. You can see the foundation is being laid; walls are building, then the roof and so on. So at any given point of a time it can be said what are the things completed and what more to be done. Managing is easy.But when it comes to software, it is intangible. You cannot see how it grows, so as to measure and manage the development process. At the initial stages you will feel that the project is on track and all the things are going smoothly, but when you reach the deadlines you recognise that lot more to be done but limited time.
On the other hand when the size of the system is getting bigger the management of it is too difficult. (Here we are talking about the hundreds and thousands of lines of code and sometimes millions of lines of code).
- The flexibility possible through software -When we are building a house it is highly unlikely that we will change the structure in the halfway though. Even we does, it will cost a lot. Since software offers ultimate flexibility, it is possible to change the designs, requirements etc. during the development cycle.
- Requirement of a software system often changes during the development - Changing requirement and the features during the development cycle is a common thing. Some times the users do not have a proper idea of what they want. When they see the system being developed half way through, they realise what they really needed. From the developers’ side, as and when they develop they get a better understanding of the domain and will find better ways to do. These may come out as new features or as improvements. Both these reasons cause the changing requirements during the development cycle.
- Non Functional Requirements - When it comes to software, only the functionality is not enough. The users expect something more from a software system. Non-functional requirements such as usability, performance, scalability etc. are important. In addition to the functionality of the system, the developers have to pay attention on these areas as well. So managing both of these requirements is not an easy job.
The role of the Software Engineer...
The role of the software engineer is to hide this complexity from the user and provide a simplified view to use. For an example every time when we are getting money from ATM, what if we (as the users) have to call the bank and ask whether sufficient money is in the account, after that again do a check to see whether the sufficient amount is there with the ATM machine etc. The system has hidden all those complex things from the user, and when the user enters the amount, it will provide money or a message.
Attributes of a complex system
Normally complex systems are formed in a form of a hierarchy. There are small sub systems that are inter-related and within those sub systems there are further sub systems and so on. But there is an elementary component which all the sub systems are made out of. The inter-component linkages within a sub system are much stronger than the intra-component linkages which are present among sub systems. The complex systems are developed by evolving. It as to be designed from the scratch and cannot be patched up to make it work.
Object Oriented Analysis
Object oriented analysis is the method of analysing the requirements in a form of an object model.
Object Oriented Design
Object oriented design is the method of designing the system that leads to object oriented decomposition by using different notations to express different models of the logical (class and object structure) and physical (module and process architecture) design of the system.
Abstraction denotes the essential characteristics that should be present to distinguish one object from another. The level of abstraction depends on the way we are using it. For an example tree can be an abstract in a system that deals with botanical details, but it may not be the case in another system.
Duleepa Karunaratne (044021)