Thursday, 20 December 2012

Introduction to Software Development

2.1 Software Development

We have seen in our previous discussion that software engineering is nothing but a disciplined approach to develop software. Now we will look at some of the activities involved in the course of software  development. The activities involved in software development can broadly be divided into two major  categories first is construction and second is management. The construction activities are those that are directly related to the construction or development of the software. While the management activities are those that complement the process of construction in order to perform construction activities smoothly and effectively. A greater detail of the activities involved in the construction and management categories is presented below.

Construction

The construction activities are those that directly related to the development of software,
e.g. gathering the requirements of the software, develop design, implement and test the
software etc. Some of the major construction activities are listed below.
  • Requirement Gathering
  • Design Development
  • Coding
  • Testing
Management

Management activities are kind of umbrella activities that are used to smoothly and
successfully perform the construction activities e.g. project planning, software quality
assurance etc. Some of the major management activities are listed below.
  • Project Planning and Management
  • Configuration Management
  • Software Quality Assurance
  • Installation and Training 
As we have said earlier that management activities are kind of umbrella activities that surround the construction activities so that the construction process may proceed smoothly. This fact is empathized in the figure 1. The figure shows that construction is surrounded by management activities. That is, all construction activities are governed by certain processes and rules. These processes and rules are related to the management of the construction activities and not the construction itself.

Click to Enlarge

In the next we will see Software Engineering Framework

Law of Diminishing Returns

1.6 Law of diminishing returns

In order to understand this concept lets take a look at an example. Most of you have noticed that if you dissolve sugar in a glass of water then the sweetness of water will increase gradually. But at a certain level of saturation no more sugar will dissolved into water. Therefore at that point of saturation the sweetness of water will not increase even if you add more sugar into it.

The law of diminishing act describes the same phenomenon. Similar is the case with software engineering. Whenever you perform any task like improving the efficiency of the system, try to improve its quality or user friendliness then all these things involve an element of cost. If the quality of your system is not acceptable then with the investment of little money it could be improved to a higher degree. But after reaching at a certain level of quality the return on investment on the system’s quality will become reduced. Meaning that the return on investment on quality of software will be less than the effort or money we invest. Therefore, in most of the cases, after reaching at a reasonable level of quality we do not try to improve the quality of software any further. This phenomenon is shown in the figure below.


Software BackgroundCaper Jones a renounced practitioner and researcher in the filed of Software Engineering, had made immense research in software team productivity, software quality, software cost factors and other fields relate to software engineering. He made a company named Software Productivity Research in which they analyzed many projects and published the results in the form of books. Let’s look at the summary of these results. He divided software related activities into about twenty-five different categories listed in the table below. They have analyzed around 10000 software projects to come up with such a categorization. But here to cut down the discussion we will only describe nine of  them that are listed below.

  • Project Management 
  • Requirement Engineering
  • Design
  • Coding
  • Testing
  • Software Quality Assurance
  • Software Configuration Management
  • Software Integration and
  • Rest of the activities
One thing to note here is that you cannot say that anyone of these activities is dominant among others in terms of effort putted into it. Here the point that we want to emphasize is that, though coding is very important but it is not more than 13-14% of the whole effort of software development.

Fred Brook is a renowned software engineer; he wrote a great book related to software engineering named “A Mythical Man Month”. He combined all his articles in this book. Here we will discuss one of his articles named “No Silver Bullet” which he included in the book.
An excerpt from “No Silver Bullet” – Fred Brooks
Of all the monsters that fill the nightmares of our folklore, none terrify more than
werewolves, because they transform unexpectedly from the familiar into horrors.
For these we seek bullets of silver that can magically lay them to rest. The
familiar software project has something of this character (at least as seen by the
non-technical manager), usually innocent and straight forward, but capable of
becoming a monster of missed schedules, blown budgets, and flawed projects. So
we hear desperate cries for a silver bullet, something to make software costs drop
as rapidly as computer hardware costs do. Skepticism is not pessimism, however.
Although we see no startling breakthroughs, and indeed, such to be inconsistent
with the nature of the software, many encouraging innovations are under way. A
disciplined, consistent effort to develop, propagate and exploit them should
indeed yield an order of magnitude improvement. There is no royal road, but
there is a road. The first step towards the management of disease was
replacement of demon theories and humors theories by the germ theory. The very
first step, the beginning of hope, in itself dashed all hopes of magical solutions. It
told workers that progress would be made stepwise, at great effort, and that a
persistent, unremitting care would have to be paid to a discipline of cleanliness.
So it is with software engineering today.

So, according to Fred Brook, in the eye of an unsophisticated manager software is like a giant. Sometimes it reveals as an unscheduled delay and sometimes it shows up in the form of cost overrun. To kill this giant the managers look for magical solutions. But unfortunately magic is not a reality. We do not have any magic to defeat this giant. There is only one solution and that is to follow a disciplined approach to build software. We can defeat the giant named software by using disciplined and engineered approach towards software development. Therefore, Software Engineering is nothing but a disciplined and systematic approach to
software development.


Software Engineering

1.5 Software Engineering

 Software Engineering is the set of processes and tools to develop software. Software Engineering is the combination of all the tools, techniques, and processes that used in software production. Therefore Software Engineering encompasses all those things that are used in software production like:

  • Programming Language
  • Programming Language Design
  • Software Design Techniques
  • Tools
  • Testing
  • Maintenance
  • Development etc.
So all those thing that are related to software are also related to software engineering. Some of you might have thought that how programming language design could be related to software engineering. If you look more closely at the software engineering definitions described above then you will definitely see that software engineering is related to all those things that are helpful in software development. So is the case with programming language design. Programming language design is one of the major successes in last fifty
years. The design of Ada language was considered as the considerable effort in software engineering.
These days object-oriented programming is widely being used. If programming languages will not support object-orientation then it will be very difficult to implement object-oriented design using object-oriented principles. All these efforts made the basis of software engineering.

Well-Engineered Software

Let’s talk something about what is well-engineered software. Well-engineered software is one that has the following characteristics.

Software has very close relationship with economics. Whenever we talk about engineering systems we  always first analyze whether this is economically feasible or not. Therefore you have to engineer all the  activities of software development while keeping its economical feasibility intact.

The major challenges for a software engineer is that he has to build software within limited time and budget in a cost-effective way and with good quality Therefore well-engineered software has the following characteristics.

The Balancing Act!

Software Engineering is actually the balancing act. You have to balance many things like cost, user friendliness, Efficiency, Reliability etc. You have to analyze which one is the more important feature for your software is it reliability, efficiency, user friendliness or something else. There is always a trade-off among all these requirements of software. It may be the case that if you try to make it more user-friendly then the efficiency may suffer. And if you try to make it more cost-effective then reliability may suffer. Therefore
there is always a trade-off between these characteristics of software.

 These requirements may be conflicting. For example, there may be tension among the following:




  • Cost vs. Efficiency 
  • Cost vs. Reliability
  • Efficiency vs. User-interface
Challenge is to balance these requirements.

Software Engineers always confront with the challenge to make a good balance of all these tings depending on the requirements of the particular software system at hand. He should analyze how much weight should all these things get such that it will have acceptable quality, acceptable performance and will have acceptable user-interface. In some software the efficiency is more important and desirable. For example if we talk
about a cruise missile or a nuclear reactor controller that are droved by the software systems then performance and reliability is far more important than the cost-effectiveness and user-friendliness. In these cases if your software does not react within a certain amount of time then it may result in the disaster like Chernobyl accident.

Therefore software development is a process of balancing among different characteristics of software described in the previous section. And it is an art to come up with such a good balance and that art can be learned from experience.

Software Engineering by IEEE

1.4 Software Engineering as defined by IEEE:

Let’s look at some of the definitions of software engineering.

Software Engineering as defined by IEEE (International institute of Electric and
Electronic Engineering). IEEE is an authentic institution regarding the computer related
issues.

“The application of a systematic, disciplined, quantifiable approach to the development,
operation, and maintenance of software; that is, the application of engineering to
software.”

Before explaining this definition lets first look at another definition of Software
Engineering given by Ian Somerville.

“All aspects of software production’ Software engineering is not just concerned with the
technical processes of software development but also with activities such as software
project management and with the development of tools, methods and theories to support
software production”.

These definitions make it clear that Software Engineering is not just about writing code.

In the next post we will again see "Software Engineering" after reviewing Software Engineering by IEEE.