Posted by: ahmedashfaque | June 11, 2017

Mock up screens: best way to design software products

Designing software products is one of the most difficult tasks. Not many people can actually create designs for good software products.

Software designs usually consist of user interface designs, component diagrams, class diagrams, object diagrams, statechart diagrams, object interaction diagrams, sequence diagrams, entity relationship diagrams etc. when you need to create a software product using object oriented design and programming.

When I design software products, I usually create all these types of software designs. Apart from software designs, i also create use case diagrams to model the software requirements.

The best way to design software products is by creating mock up screens first. I always prefer this way because mock up screens can be used to create all other types of software design diagrams easily. Why it is so? Let us understand.

Mock up screens depict user screens and what the user will do or receive information after computations. Mock up screens can also be easily understood by both the business domain experts and the project teams. So there are no chances of misunderstanding between the 2 parties.

Generally for a software product, there are user screens from where the user will provide inputs. These inputs are then used for computations and after computation, the user is provided with computed results on their user screens. The user screens where the user is supposed to provide inputs can be used to create classes easily. All the fields on a user screen become properties of a class or classes. The screens which show computed results can be used to model behavior of classes. So most of the classes and their members can easily be captured from the mock up screens.

You can also create relationship among classes from the mock up screens. For example, if a user screen where computed results are shown uses field data from more than one class then the classes having members corresponding to those fields will have some kind of relationship.

Similarly if one user screen needs inputs from the user to show another screen requiring user inputs on this screen again then the class which will be built corresponding to this screen will definitely will be a child class of the class corresponding to the first screen.

Thus you will end up creating all classes, their members and their relationships from mock up screens. From mock up screens you can also create all other types of software design diagrams easily.

Posted by: ahmedashfaque | June 3, 2017

Importance of technical documentation

Everybody knows importance of user manuals. Without user manuals, using a software product by end users becomes very difficult as software products have become very large and complex. navigating and finding the right functionality to be used sometimes becomes laborious task. How transactions need to be performed using a software product also sometimes become tricky. user manuals become very handy in these scenarios.

For the technical support people, user manuals are also handy. But they need more than just user manuals. They need to know the internals of the software product do perform any kind of maintenance. So for them a complete knowledge about the software design is extremely important.

Very often, the project team which designed and built the software product become lazy and do not create the important software designs. In most cases, they know the design by heart and they have use for themselves for elaborate software designs. They consider it waste of time in doing this work. But when the software product is deployed and goes into production and users find defects or difficulty in using the software product then lack of good software design becomes a real handicap for the technical support team. In such a scenario, the software vendor is bound to face loss of revenue as users will not be able to use such a software product.

During software development process, software design often gets changed. The initial software design is not changed and updated whenever this change in software design happens. This is one of the most common problems on software projects.

Updated and complete technical documentation thus is very important for any software product to become successful.

There is a big gap between what a software product needs to do and how it is actually used by users. As long as the software product works fine, there is no problem for the support staff; no matter how it is being used by users.

Despite best efforts by the testing team, invariably a software product contains defects which prevents end users to use the software product effectively. Changing the source code and creating a new version of the software product to remove software defects is a big issue for software vendors. It is not possible to take software maintenance projects too often. They are costly too.

So what can be a good strategy for a software vendor in this scenario? Here comes, “Walk Arounds”. A walk around is a temporary solution which allows a software product to work effectively despite having defects. When a software defect is found in a software product then it is still possible to do transactions using the defective software product by using some other way of doing the same transaction. If a walk around is found and provided to end users then the end users can still use the defective software product effectively. So there is no immediate need to take a maintenance project to fix the defect.

Just recently I had ordered a medicine for my father for his brain tumor. It was shipped from Kentucky, USA and had to be delivered in India at my home address. For international parcels, the Indian government requires the shipping companies to get KYC (Know your customer) form filled by the customers. So I went on the website of the shipping company (DHL) and filled and submitted the KYC form online. The next day I received an email stating that my KYC form was rejected as I had put name of the shipper (Medicine Manufacturing company) as a consignee. The consignee should be the receiver of the parcel. So I went again on their website and tried to edit my KYC form. Unfortunately I discovered that the consignee field was not editable. So I phoned the shipping company (DHL) to know what to do. They told me that the consignee field indeed is not editable. But they provided me an alternative. They told me that i should use an alternate telephone number in the form and i will be able to submit the form with the correct consignee name. I immediately did it and my form was submitted successfully.

The shipping company used a walk around here when there was a defect in their software product (non-editable consignee field). This is a very good example of how to use a walk around.


Posted by: ahmedashfaque | April 30, 2017

Transparency of information – The limits

When any organization is computerized, one of the first things which is considered as a benefit is transparency. Computers ensure that all transactions are recorded cleanly and are available whenever required. All this transaction data can be kept for years and when required for purposes like tax records etc. can be shown. This aspect of computerization definitely curbs corruption and helps bring transparency.

But the other aspect of computerization is that all this sensitive data can be hacked and can be misused. For example, a person’s bank account information can be hacked and money can be stolen from his/her account. Then one more aspect is about privacy of people. If personal details of people can be hacked from a computer system then privacy of that person is compromised.

How to ensure that only the required information about people is taken and stored in a database? The other question is: how to ensure that only authorized people have access to data (information). The next question is: how to ensure that any sensitive data is never hacked.

Generally most governments like to get as much information about citizens as possible for many reasons. So through various computer systems they store information about citizens. But all this sensitive information about citizens is always in danger of being hacked by some unscrupulous people.

This fact puts a limit as to how much information any government can store about its citizens. If any private company stores sensitive information about its customers then again the misuse of this information is always a risk.

The best solution for these scenarios is 2 pronged: to put a limit as to how much information should be stored and how to provide a security mechanism so that this data is never hacked.

Posted by: ahmedashfaque | April 26, 2017

Difference between IT, software engineering and computer science

In colleges and universities, you may notice that the degrees offered to students may include a degree in computer science, a degree in software engineering and a degree in information technology. What is the difference among the three degrees? What is the difference among IT, software engineering and computer science?

Computer science is study of technology behind computers. It includes learning about system software (operating systems etc.), hardware interfaces, software interfaces, theory of computers, mathematical modeling etc.

Software engineering is the study of techniques which are used to build software products and applications. Software engineering is the real science which helps in actually building software products. Some of the areas of study include requirement engineering, software engineering methodologies, software design, software design implementation, software testing etc.

After a software product is built then Information Technology (IT) comes into picture. IT is the study of hardware and software infrastructure which actually is used by people to use computers for their work. IT also includes management of data which gets generated when computers are used by people. IT also includes providing support to users of computers when they face any problems in using the computers and the software application installed on those computers. Now a days, very large network of computers are used by governments, multinational companies etc. So importance of IT is increasing day by day.


Posted by: ahmedashfaque | April 7, 2017

Law of diminishing returns

Have to ever heard of the “Law of diminishing returns”? It is a term used in marketing. It signifies that when a  product is launched in the market then it goes through the product market life cycle and ultimately there is no market potential left for the product and so its marketing discontinues. If this law of diminishing returns can be applied to different concepts?

We often hear of new project management or software engineering concepts to increase productivity of software project teams. Some of the techniques to do that include adopting a more productive programming language, project team restructuring, introduction of team performance incentives, hiring better talent etc.

But the most common approach to increase productivity is to use best practices. Using services of a consultant who specializes in analyzing current project management practices of any organization and making suggestions to improve upon these practices; any organization can bring in better productivity. These productivity gains are generally based on adopting best practices as practiced by organizations who are performing better.

Generally most organizations adopt these practices over time. Indeed these best practices will help in improving on productivity. But when most organizations have adopted these practices then competitiveness of all of them become the same. So the gains enjoyed by early adopters start diminishing over time. The money and effort involved in changing the organization is paid off over time but the gains enjoyed in the early phases start diminishing. This situation is similar to the product market life cycle. The law of diminishing returns kicks in after some time.

When this happens; organizations start looking for better practices once over again.

Software industry has always fancies for a day when software components will become true plug and play things. After all electronics industry has become a true plug and play arena for electronics components for a long time. You can always replace a faulty electronic component with a new one and your electronic gadget will never complain. Why software components have not become true plug and play things yet. Let us discuss.

Software products are essentially service oriented in nature. Especially in the era of the Internet, people do not buy software products. They use software products which are installed somewhere on the world wide web. Off course there are software products like word processors or spreadsheets which users still buy, install on their computers and use. But these kinds of software products will also be replaced by their cousins which can be installed somewhere on the world wide web and can be used from anywhere.

Thus this kind of scenario requires software products to be service oriented. This also means that a single software product installation should be able to service thousands if not millions of users. This is in direct contrast to the scenario for electronic products; which are overwhelmingly meant to be used by only a few people per installation.

Even if a software product vendor creates a true plug and play software component; it will not make much economic sense. How many people will actually buy such software components? Not many in fact! After all how many installations of such a software component will be there globally?

Thus it does not make any sense in developing such software components.

Posted by: ahmedashfaque | March 16, 2017

Refinement – The way to create beautiful software products

In a previous post; we had learned about abstraction for building powerful software products. Now let us learn about refinement.

Refinement is the opposite concept compared to abstraction. In abstraction, we try to aggregate dissimilar things by ignoring dissimilarities and aggregating them using the common thread running among them. When we are able to aggregate things for the purpose of building a software product which can be used by many types of users; then the next thing we need to do is to actually build different software product features which are useful for these different types of users. How we can do that? Let us learn here.

In the post on abstraction, we had seen how we can aggregate similar functionalities of categorizing text (numbered, tabulated, bulletted etc.) for a word processing software product, using abstraction. Now when we need to implement these functionalities then we need to implement them separately. How we can do that?

At the abstracted level we can create a common interface or class. This class will have the common functionalities implemented. Now we can create child classes which will implement the specific functionalities of each of the software features. For example, we can have a child class which can now implement functionality for formatting text in bullet form and another child class which can now implement functionality for numbered text. This way we can implement all functionalities needed by creating a separate child class for each functionality.

In the old programming languages; refinement used to be done using many if-else statements. The drawback of doing it this way was that you can end up having many nested programming statements. This would lead to unstable behavior of the software product during use and would lead to software defects. Using child classes overcomes this problem. Child classes allow easy maintenance of the software product as well.


I am happy to announce that Kindle edition of my book “Foundations of software engineering” is now available. You can download and read it on your favorite Kindle device. The web page for the Kindle edition is here.

My book “Foundations of software engineering” is primarily written as a textbook for University level courses related to software engineering. It is getting extremely good reviews from professors around the world; particularly from American and Indian universities.

Any professor who wants to adopt my book for his/her courses related to software engineering can get an evaluation copy of my book by clicking this link.

I have also provided a lot of additional material on software engineering page of this website. I hope my book

will become the best tool to teach software engineering to students.

« Newer Posts - Older Posts »