Subscribe by Email

Monday, October 31, 2011

Project Scheduling - Different ways for tracking the schedule.

A proper project schedule is very important for a successful project delivery. The project schedule is a road map for a software project manager. A project schedule needs to be properly developed. A proper project schedule defines the tasks and milestones that are tracked and controlled as project proceeds. This tracking needs to be accomplished nicely and there are different methods and ways to do so...

- Timely project meetings regarding the status of the project are held and it should be ensured that each team member should report the progress achieved and the problems that are faced.
- There are different reviews that are conducted throughout the software engineering process. It becomes necessary to evaluate the results of all these reviews in order to accomplish proper tracking.
- To accomplish proper tracking, for each task of the project, the actual start date and the planned start date should be compared.
- To accomplish tracking, one should determine whether the formal project milestones are achieved by the scheduled date.
- To accomplish tracking, progress should be assessed quantitatively.

The best indication of progress is the completion and successful review of a defined software work product.
The control administers the project resources, cope with problems and direct the project staff. Control is light if the project is on schedule and within budget. The control is exercised to reconcile the problems if they occur.

In case the problem is identified and diagnosed:
- staff is redeployed
- additional resources should be focused on problem area.

A severe deadline can be managed by time-boxing technique. It chooses an incremental software paradigm and a schedule is derived for each incremental delivery. This technique is done when the product may not be deliverable by a pre-defined deadline.

Sunday, October 30, 2011

Different licensing situations in software development - Part 4

In previous posts (licensing situations in software), I have talked about how not licensing any sort of stuff not owned by you can cause a lot of problems. This can be when you are using software that is not owned by your company (and for which you have not taken the license to use within your software), or when you are using content such as images that does not belong to you. Another great example is when you use quotes / sections from books / parts of poems that do not belong to you (which can happen if you are developing a software that does some sort of word processing / helps in the creative process / have a website that provides some sort of content (such as a site that provides you electronic greeting cards)). All these cases lead you towards violation of somebody else's ownership and possible legal action against you.
If you think that this is not serious, consider the following cases:
Claims by Microsoft (link). These claims are from Microsoft against Open Source software.
Action against Microsoft (link). This was a judgment against Microsoft by a judge for the incorporation of some software.
These are big cases, but there are smaller cases that happen all the time, where companies have to pay damages because they are using some components for which the licensing is not proper. So, you need to ensure that any component that you integrate, or any content owner by others that you integrate, all needs to be thought through and part of a strategy.
Well, this is enough for this post, will write more on this topic in the next post.

Saturday, October 29, 2011

Different licensing situations in software development - Part 3

In previous posts (software licensing), I have been writing about software licensing, the need for the same, and what implications this has for the software development process. In this post, I will write more on this topic.
Another area where people slip up is when they need an image for their software. Consider that you are developing a software that is meant for children, and you want a great image for some of the dialogs / screens that are there in the software. Now, what do you do ? Well, I have seen many cases where people look for some great looking images on the internet, find them, reshape them as per their needs, and then start using those images.
In many cases, this strategy works, since the original owner of the image does not that something like this has happened. Or the images used are such that they are somewhat generic, and the owner cannot even figure out that this is their specific image. Or, the person thinks that it is just an image, and the effort involved to challenge the usage of the image in a commercial usage is not worth it.
But there is a contra case. Suppose you just downloaded some images, and these images also show some recognizable faces. This is a very serious matter. When a recognizable person is used in commercial situations, the person should have given permission to use their image for this specific purpose. If this is not done, the person can file suit, and possibly claim penalties for such unauthorized usage. Such usage is typically covered under a term such as a model release (link)

In case you are still not convinced about the need to use the proper software licenses / copyright of images, I will wrote more about this in the next post on this subject.

Monday, October 24, 2011

Software Project Scheduling - Timeline Charts

What is a timeline chart ? Well, a project timeline is created to display the various activities of a project on a chart, in such a way that it depicts the tasks of the projects, the duration of the tasks, the sequencing of these, and the major milestones of the project. A Gantt chart is a typical software timeline chart, and the most popular one that most people tasked with preparing such a chart are aware of.

In timeline charts, a series of events are arranged on a bar graph. These charts are like user items. Each event can be a single point in time or a date range. A timeline chart enables the planner (and other stakeholders) to determine the set of tasks that will need to happen at a given point of time. The effort, duration and start date are inputs for each task. These tasks can be assigned to specific individuals. With these inputs, mapped on a chart, the timeline chart is developed. It is also called Gantt chart and it can be developed for the entire project. When the Gantt chart was first developed, it was a revolutionary construct in the field of project management.

The format of a timeline chart depicts the part of software project schedules that emphasize the concept scoping task for the product on which work is happening. All work tasks are located on the left hand column. The duration of each task is indicated by the horizontal bars. The diamonds indicate the task concurrency which indicates when multiple bars occur at the same time.

Project tables are tabular listing of all project tasks. Project tables are produced when all the information which is necessary for the generation of timeline charts are obtained. These project tables consists of all project tasks, its start and end date and the related information.

Wednesday, October 19, 2011

How a task network is defined for a software engineering project?

The task network is a useful mechanism for depicting inter task dependencies and determining the critical path. When more people are working on a software engineering project, tasks and sub-tasks have their own inter-dependencies and also as the number of people increases, the development activities and tasks are performed in parallel. These concurrent tasks must be coordinated so that so that they will be complete when later tasks require their work products.

What is a task network?
It is also known as activity network. It is a graphic representation of how the tasks are flowing in a software engineering project. There is a pattern and a sequence that is followed by tasks. This task network can be used as a mechanism or a way to know this sequence and pattern of the tasks that can act as an input to an automated project scheduling tool.

On a macroscopic view, task network depicts the software engineering tasks. On a microscopic view, each and every task in the task network is expanded. For a concept development project, task network includes the following tasks:
- Concept Scoping
- Concept Planning
- Technology and Risk Assessment (It constitutes three tasks).
- Proof of Concept
- Concept Implementation (It constitutes three tasks).
- Integrate the three tasks which constitutes concept implementation.
- Customer Reaction

Software engineering activities are concurrent in nature. This nature leads to scheduling requirements. The project manager should keep in mind the following points to ensure continuous progress:
- He should determine the inter-task dependencies.
- He should be aware of tasks that lie on critical path which means the tasks that should be completed on schedule if project has to completed on schedule.

Tuesday, October 18, 2011

How to define a task set for a software project?

The process model is defined by a set of tasks which enables the software team to define, develop and support computer software irrespective of whether the software team uses an incremental model, linear sequential method, an evolutionary model. Nearly every project will have a different task set which means that no single task is appropriate for all projects.

The set of tasks that a simple project uses or needs is different from the set of tasks that is needed by a large complex system. A collection of task sets should be defined to meet the needs of different types of projects by the software process that is effective.

The task set that is developed should be distributed on a project time line. Task set depends on the type of the project and the rigor with which the software team decides to do the work. Different kind of projects encountered by software organizations are:

- Application enhancement projects
- Content development projects
- New application development projects
- Application maintenance projects
- Re-engineering projects

The factors that affect the choice of the task set for a single project type are:
- project size.
- number of potential users.
- critical nature of mission.
- longevity of the application.
- requirements stability.
- maturity of applicable technology.
- embedded and non-embedded characteristics.
- performance constraints.
- project staff.
- re-engineering factors.

For example, in concept development projects, major tasks followed are:
- Concept scoping
- Preliminary concept planning
- Technology risk assessment
- Concept proof
- Implementation concept
- Customer reaction

Monday, October 17, 2011

Project Scheduling - Relationship between people and effort

For a small project, requirements analysis, performing design, code generation and test conduction can be done by a single person but as the size of the project increases, more people get added. Adding people later in the project often has a disruptive effect on the project causing schedules to slip even further. If more people are added to a late project, be sure that you have assigned them work that is highly compartmentalized.

The people who are added later in the project should know the system properly. In addition to the time that it takes to learn the system, it also increases the number and complexity of communication paths. Every communication path requires additional effort and time.

Project schedules are elastic. It is possible to compress or extend a desired project completion date to some extent. If delivery can be delayed, the PNR curve indicates that project costs can be reduced substantially. As the project deadline becomes tighter and tighter, you reach a point at which the work cannot be completed on schedule, regardless of the number of people doing the work. The reality should be faced and a new delivery date should be defined.

Effort should also be distributed across the software process workflow. Recommended effort distribution is referred as 40-20-40 rule. Front end analysis and design and back end testing are allocated 40% of all effort while 20% of effort is allocated to coding. The characteristics of each project must dictate the distribution of effort. Requirement analysis may comprise 10-25 percent of project effort. Effort on analysis or prototyping should increase in direct proportion with project size and complexity.

Sunday, October 16, 2011

Different licensing situations in software development - Part 2

In the previous post (software licensing in software development), I had written about some of the situations that emerge in the realm of commercial software development. Most of these have to do with the usage of software from other companies that are included in your own software. One may ask as to why you would need to include software from other companies as part of your own deliverable ? Well, there are many reasons. The biggest reason is that your team cannot write software for everything that is needed to be done, and somebody may have done a far better job in a specific area of software that you would take a long time to do.
Consider some specific situations. You have a children's software that allows them to create their own cards with a lot of fancy stuff, and eventually, you would be able to create some cards with lots of music and some videos. One of the ways to share this is through writing such cards to a DVD, such that you can give this to the friends of your children and they can play this on their own DVD players. There are 2 spots where there is a need for some specialised software. One, when you are using pictures and videos, these can be in a number of different formats and you need a way to read the most common of these. If you were to try and write all such tasks into your own software, your team might not have the technical ability to be able to decode some of the formats, and you will need to use some external software or codecs for the same purpose.
Similarly, when you need to write these creations to the DVD, you need some specialized software. Writing to DVD requires the ability to connect to the DVD using the appropriate middleware, and a lot of this stuff is already present in existing software that can be used in your own software.
These are 2 simple cases that show the usage of other 3rd party software in your code, and as your own software becomes more complicated, the need for more such software becomes even more complicated.

I will write more in the next such post ..

Friday, October 14, 2011

Different licensing situations in software development - Part 1

In the previous post (perils of using unlicensed software), I had talked about some of the problems that occur when members of a team start using software that is not licensed. In this post, I will try to cover some of the different types of licensing that exist and the complications that arise due to each of them.
First of all, some basic explanation. What is a software license ? A software license is a legal document that bestows some rights on a person. All software has some sort of copyright protection, which means that if you do not use the software in the prescribed way, you are in violation of the agreement, and can be prosecuted for the same. For example, you could be buying a software in a concessional format that allows the usage of the software only for single person use, and you end up letting all the members of a group use the same software (and I have seen that happening, and there was no check in the software to prevent that from happening).
So, each software typically comes with a license. The license can either be in the form of proprietary licenses or free / open source licenses. These 2 different types of licenses have fundamental differences in terms of the rights that they give to the end user.
Most commercial software have proprietary licenses, which impose some sort of restriction on the end users. The restriction could be in several forms. If you consider the use of codecs such as those used in the media industry, there are stiff terms for the usage of such codecs. For example, when you use software used for the creation of DVD's / Blue Ray discs, then the payment for the usage of such codecs / software could be in the range of the hundreds of thousands of dollars, or many dollars per unit of the end software sold. Using such software would typically need management approval, and also clearance from the legal team as well (and typically, if you are using software from somebody else, then you should have some sort of legal help to ensure that you are not getting into any trouble).

Will write more about this in the next version of the article.

Thursday, October 13, 2011

Using unlicensed code in your software - the perils of doing so

We once had an interesting situation in our group. Our group makes application software, which sells fairly well and is one of the leaders in its segment. One of the guidelines that we follow (to ensure that our software does not get into any of the patents mess that seems to occur from time to time) is to ensure that nobody takes any random code from somewhere without control. This policy ensures that the software is at low risk of having people challenge us later that we violated their patents, and a court action can threaten the revenues that we earn from the sales of the software.
Why is there a problem with picking up code from different places ? Well, you need to be careful of the licensing of the software that you are using. If you don't have the proper rights of the software you are using, then your revenues are in grave danger. Once we had a developer running into a problem with a software assignment, he searched for a solution, found a software, downloaded it, and started using it. Unfortunately in all this, he never told his manager or the project manager about what had happened.
Towards the end of the project, another developer was looking at a bug, and found a set of binaries that looked unfamiliar. And then the story unraveled. We were able to find a substitute, and it was good that we did so; the alternate was to be found using the software that had a term in the license whereby we were compelled to pay a $1 fee for every unit we sold. That would have have a huge impact to revenue, especially since the software only sold for $19 per unit.
And I have not even covered the problems of using software that is covered under open source or LGPL, which has significant issues of its own (and which I will cover in another post). Typically, what needs to be done can be covered in 2 major preventive steps:
1. Ensure that each developer knows the policy with regard to using licensed software, knows the process of requesting usage of new software, and knows the penalties for violating such policies.
2. Ensure that the entire code base is checked for any such code that could be termed as unlicensed code, such that you have eliminated a major risk.

What is project scheduling? What are the basic principles of project scheduling?

Software project scheduling is an activity that distributes the estimated effort across the project duration that is planned by allocating the effort to specific software engineering tasks. There are two perspectives of scheduling for software engineering projects:
- End date for release of computer based system has already been established. The organization is constrained to distribute effort within the time frame.
- Rough chronological bounds are discussed but end date is set by software engineering organization.

The basic principles that guide software project scheduling are:
While developing a schedule, compartmentalize the work, note task inter-dependencies, allocate effort and time to each task, define responsibilities, outcomes and milestones. Each of these principles is applied as project schedule evolves.

- Compartmentalize the project into number of manageable activities, tasks and actions. Both product and process are decomposed.
- Inter-dependency among various activities, tasks and actions should be determined. Some tasks can occur in sequence and some in parallel.
- Time frame should be allocated to each task. Task should be assigned a start and end date and whether the work is done on a full time or part time basis.
- Effort estimation is allocating number of people on software team. Project manager should ensure that no more than the allocated number of people are scheduled at any given time.
- Responsibilities should be defined for every team member.
- Outcomes should be defined for every task that is scheduled.
- Milestones should be defined for every task or group of tasks.

Wednesday, October 12, 2011

What makes one C compiler better than the other?

What makes C compiler better than the other? Well, that’s a question often debated upon. As we all know c is a general purpose programming language which was developed to run on UNIX operating system and till date it is the most widely used programming language being used to develop programs. it uses a weak compiler as compared to other language compilers.

The C compiler provides low level access to computer memory and offers programming constructs that are very easy to convert to machine level language. C compilers use minimum run time and they are very fats compilers though prone to errors. A C program can easily be converted to another language program with a minimum of rewriting. C compiler allows structured programming and is very flexible. Its static system avoids many of the errors that can happen during run time.
- C allows the executable code to be stored within functions.
- C compiler terminates a statement with a semicolon.
- C is basically a procedure oriented language.

There are many C compilers available in the market today and most them run on all operating systems including both windows and UNIX. Some of these c compilers are available as freeware, some are available under proprietary license, and some have BSD license and some other have GPL license. Many of the c compilers are not available online.

The best about C compilers is that a majority of them support “integrated development environment” or IDE which makes them more easy to use. Some C compilers apart from having IDE supporting feature come with some third party features which extend the functionality of the language and make it work faster. They provide better editing options and strong macros with great compiler integration and run time.

Most of these compilers take only 300 MB of space on your hard disk drive. For windows some are available in the size of 170 MB and so the installation process is not time consuming and does not checks your patience.

C compiler lets you use parallelism. Any source code before execution, needs to be converted into machine level language i.e., in the language that is easily understood by the CPU processor. C compiler does this effectively and very fast as compared to other language compilers available today.

C having a fast compiler is mostly used to write game codes. Since other languages are largely optimized, C is used widely even today. C compiler provides abstraction to a great degree. Compiling depends a lot on the length and complexity of the code and on the speed of the CPU processor. But, the C compiler compiles the required code in as less time as possible. C compiler being a very large and complex tool is very powerful and useful. C can be thought of as a portable assembly language and scripting of many other languages is based on C language only.

Learning all the features of C is a great deal. Many C compilers support all ANSI C standards. C compilers are so small that they can be directly used from a rescue disk. C compilers can produce x86 and x86- 64 code very fast. Many C compilers today come with an optional memory feature and a bound checker.

Few compilers can simultaneously compile and run the programs using the “command line” option. Under this feature programs run like shell scripts. The C compilers are exceptionally faster and better than any other compiler available today in terms of speed of compilation. C language is free of what is called bombastic jargon and it is not much optimized. Most of the C compilers like TCC produce codes in a single pass and each statement is compiled very carefully.

Tuesday, October 11, 2011

What are the problems of a C compiler?

Every programming language has some advantages and disadvantages which are not present in the other languages. Some languages are capable of solving some problems better as compared to other languages. But the point is that most of the problems have similar needs, requirements and logic, so the point where languages differ from each other is the efficiency with which they solve the problem.

Some provide more efficient and fluent solutions while others don’t. As we all know C is a basic programming language which was developed to solve problems and develop programs relating to kernels of the operating systems, compilers and graphical user interfaces. C compiler though being fast is not so efficient. It provides many downsides for a large number of problems. Many of us think that C is the fastest language but this is not true.

C++ compiles most of the C programs at the same speed as C++ does. Some of the features of C language like virtual function calls result in over heads. C is not object oriented. This in turn makes it more inconvenient to implement some programs. It is not able to force object orientation everywhere. C makes some programs that require object oriented programming more error prone. C has got a weak typing system as compared to other programming languages. This leads to many programming errors after compilation of the program.

A bigger standard library C++ allows the full use of the C standard library. This is very important of course, as the C standard library is an invaluable resource when writing real world programs.
- C++ has a library called the Standard Template Library.
- This standard library contains a number of templates that can be used while developing programs almost of any kind.
- It also includes many common data structures which are very useful like data lists, maps, data sets, etc. the standard library routines and its data structures are tailored to the specific needs of the programmer.
- Though standard library is no gold knife, still it does gives a great help in many programs for solving general purpose related problems. Many tasks like implementing a linked list in C take a lot of time.
- Though the compilation is fast but, who has got that much time to write those lengthy codes. That time you will feel the need for a better compiler which provides a shorter and effective code for implementing lists and other sorts of data structures in array form.

Even though C language was standardized long back in 1998, but till date we don’t have any good compilers for this language. It’s a very complex language and so requires a heavy compiler like itself to compile it. Another problem related to C compiling is that being a big and complex language, many few people have its correct knowledge of usage. A lot depends on the programmer also. If you are typing in the wrong code you are sure to get bad results.
Today also most of the programs are written in C. a need is felt to convert them to another programming language for better compilation. But the conversion is no good solution. Conversion of a C language program code is often ended up in rewriting almost the entire content of the program.

Programs written in C will always have 2 major problems. Firstly their code will be unusually lengthy and time consuming. Secondly, the program execution will be slower even though the compilation time is very less. The C program codes require more time to read, write and understand. C compiler being ineffective can crash any time. There’s a lack of high level routines in C compiler.

Monday, October 10, 2011

Some details about Multi dimensional arrays in C...

An array can be defined as the collection of variables of the same type that are referenced by a common name. Arrays are of two types namely one dimensional arrays and multi dimensional arrays. One dimensional array consists of finite homogenous elements whereas a multi dimensional array is composed of elements each of which is itself an array. Arrays refer to a named list of a finite number n of similar data elements. Each of the data elements can be referenced respectively by a set of consecutive numbers, usually 0, 1, 2, 3, 4,….., n. the simplest form of a multi dimensional array is the two dimensional array.

You can declare a two dimensional array as follows:
Type array name [ rows ] [ columns ];

Where type is the base data type of the array having name name, rows, the first index, refers to the number of rows in the array and columns, the second index refers to the number of columns in t5he array. For example:

Int sales [ 5 ] [ 10 ] ;

The general form of array initialization is shown below:

Type array name [ size N ] = { value list } ;

The value list is a comma separated list of array elements values. The element’s values in the value list must have the same data type as that of the base type of the array.
Int days [ 5 ] = { 1, 2, 3, 4, 5 } ;

Character arrays can also be initialized as shown below:
Char string [ 10 ] = { ‘c’ , ‘a’ , ‘t’ ‘\0’ } ;

Multi-dimensional arrays can also be initialized in the same way as simple dimensions one. For example:
Int abc [ 3 ] [ 2 ] = { 1, 1,
2, 2,
3, 3 } ;

This can be done it the other way also :
Int abc [ 3 ] [ 2 ] = { 1, 1, 2, 2, 3, 3 } ;

A multi dimensional array of strings can be initialized as shown below:

Type array name [ size N ] = { value list } ;

Here type declares the base type of the array, the array name specifies the name with which the array will be referenced and size defines how many elements the array will hold. The size must be an integer value or integer constant without any sign. The value list is a comma separated list of array’s elements values. The element values in the value list must have the same data type as that of the base type of the array.

Int days [ 5 ] = { 1, 2, 3, 4, 5 } ;

Character arrays can also be initialized as shown below:
Char string [ 10 ] = { ‘c’ , ‘a’ , ‘t’ , ‘s’ , ‘\0’ } ;

Multi dimensional arrays are also initialized in the same as the single dimensional one. For example:
Int cube [ 3 ] [ 2 ] = { 1, 1,
2, 2,
3, 3 } ;

This can be done in the other way also:
Int abc [ 3 ] [ 2 ] = { 1, 1, 2, 2, 3, 3 } ;

A multi dimensional array of strings can be initialized as shown below:
Char abc [ 3 ] [ 2 ] = { “Sunday” , “Monday” } ;

C allows you to skip the size of the array in an array initialization statement. This is called unsized array initialization. C allows arrays of more than 2 dimensions. The exact limit of dimensions is determined by the compiler we are using.

Saturday, October 8, 2011

Some details about Strings and Arrays of Strings in C

Multiple character constants can be dealt with in 2 ways in C. if enclosed in single quotes, these are treated as character constants and if enclosed in double quotes, these are treated as string literals. A string literal is a sequence of characters surrounded by double quotes. Each string literal is automatically added with a terminating character ‘\0’. Thus, the string “abc” will actually be represented as follows:

“ abc \0” in the memory and its size is not 3 but 4 characters ( inclusive of terminator character ).

Arrays refer to a named list of a finite number n of similar data structure elements. Each of the data elements can be referenced respectively by a set of consecutive numbers, usually 0, 1, 2, 3, ……., n. if the name of an array of 10 elements is ARR, then its elements will be referred as shown below:

ARR [ 0 ], ARR [ 1 ], ARR [ 2 ], ARR [3], …… ARR [9]

Arrays can be one dimensional, two dimensional or multi dimensional. The functions gets() and puts () are string functions. The gets() function accepts a string of characters entered at the keyboard and places them in the string variable mentioned with it. for example :

Char name[ 21 ];

The above code declares a string namely name which can store 20 valid characters ( width 21 specifies one extra character ‘\0’ with which a string is always terminated ). The function gets() reads a string of maximum 20 characters and stores it in a memory address pointed to by name. As soon as the carriage return is pressed, a null terminator ‘\0’ is automatically placed at the end of the string. The function puts () writes a string on the screen and advances the cursor to the newline. Any subsequent output will appear on the next line of the current output by puts ().

Arrays are a way to group a number of items into a larger unit. Arrays can have data items of simple types like int or float, or even of user defined types like structures and objects. An array can be of strings also. Strings are multi dimensional arrays comprised of elements, each of which is itself an array.

A string is nothing but an array of characters only. In actual C does not have a string data type rather it implements string as single dimension character arrays. Character arrays are terminated by a null character ‘\0’. So, for this reason the character arrays or strings are declared one character larger than the largest string they can hold.

Individual strings of the string array can be accessed easily using the index. The end of a string is determined by checking for null character. The size of the first index ( rows ) determines the number of strings and the size of the second index ( columns ) determines maximum length of each string. By just specifying the first index, an individual string can be accessed. You can declare and handle an array of strings just like a two dimensional array. See an example below:

Char name [10] [20] ;

Here the first dimension declares how many strings will be there in the array and the second dimension declares what will be the maximum length of a string. Unlike C++, C has some different functions for adding or concatenating strings, checking string length and to see the similarity of two strings. The functions are namely strlen, strcmp, strcat, strrev etc and are included in header file string.h. Strings are used for holding long inputs.

Friday, October 7, 2011

The Make/Buy Decision - Decision Trees and Outsourcing

Software engineering managers face the make or buy decision. The make/buy decision is based on following conditions during the final analysis. These conditions include:
- Whether the software product is available sooner than the internally developed software?
- Whether cost acquisition + customization < cost of software development internally?
- Whether outside support cost < internal support cost?

Decision Tree
Suppose X is the decision tree of a software based system. Three cases derive:
- building X from scratch.
- reusing the existing components to construct X.
- buy software from market and make the necessary changes.
- get a vendor and and hand him the software development.

If X is built from scratch, chances are 70% that job is difficult. In a decision tree, different paths are taken and the projected costs for reuse, buy and contract are evaluated. Based on the output, the probability and projected cost is the lowest when we buy the software from the market.

during the decision making process, there are many criteria to be considered and not just the cost. Factors like availability, experience of developer/vendor/contractor, local politics, conformance to requirements and likelihood of change can affect the final decision to build, buy or contract.

Outsourcing decision is basically a financial one. The way in which the software and systems that we need at lower price is outsourcing. It is a simple concept. All the engineering activities are handed over to the third party who is responsible to complete the work at low cost and most probably good quality.

At strategic level, decision of outsourcing is based on the fact whether a significant portion of all software work can be contracted to others. At tactical level, decision of outsourcing is based on the fact whether a part or all of a project can be accomplished by sub-contracting the software work.

Advantage of outsourcing:
Cost savings are achieved by reducing number of people and facilities that support them.

Disadvantage of outsourcing:
The company loses some control over the software that it needs.

Thursday, October 6, 2011

Some details about Pointers in C...

There was a need for a kind of variable that could store the address of another variable, so that the value of he variable could be directly accessed through its memory address and could be manipulated more easily and in a short span of time. The “pointer” is such a variable invented. It can be defined as a variable which stores the address of another variable. A pointer can be declared easily as shown below:

int *ptr1;

The “int” keyword is used to tell compiler that the pointer “ptr1” will store the memory address of an integer type variable. The symbol “*” called asterisk is used to tell the compiler that the variable “ptr1” is actually a pointer and that it will store the address of the variable it is pointing to irrespective of the bytes it will require to store the memory address. The pointer “ptr1” is said to point to an integer variable. N the above declaration we didn’t provide ptr1 with a value i.e., it’s empty now. If the declaration is made outside the function, the pointer “ptr1” will be initialized to a value that will not point to any of the variables or objects in a C program. Pointers initialized in this manner are said to have a null value or are called as “null” pointers. Null pointers are very useful in many of the C programs as they prevent system crash. A null pointer is implemented using a macro. The macro used is called “NULL” macro. If you set the value of a pointer using the above mentioned macro through an assignment statement as shown below:

Ptr1 = NULL;

It is assured that the pointer is now having a null value or it has become a null pointer. A null pointer can be tested using the below given statement

if (ptr 1== NULL);

Now suppose we want to store the address of an integer a in the above declared pointer “ptr1”, we will use the following statement:

ptr1 = &a;

Before proceeding further, we should now that a pointer has two values attached to it. One is the “l value” and the other one is the “r value”. L value is where the address of the variable pointed to is stored. R value stores the value of that variable. Now, the function of the “&” operator is to retrieve this l value of the variable a. the assignment operator copies the address of the variable a to the pointer “ptr1”. Now the pointer “ptr1” is said to point to variable “a”.

The “*” operator is also called the dereferencing operator and is used for de-referencing as follows:

*ptr 1 = 10;

The above statement will copy the value “10” to the address of variable a pointed to by the pointer “ptr1”. The above assignment statement can be written in another way as shown below:

Printf ( “ % d \n ”, *ptr1 );

The above statement will also print the value stored in the pointer on the screen as output.

Pointers are very much essential nowadays in programs. They solve basically two problems avoiding many other problems that may follow. First problem that they solve is that they make it easy to share information and data through and from the different sections of the memory. Secondly, they solve the problem of having complex structures. They make it easy to have linked data structures namely linked lists and queues and also binary trees. Pointers reduce the complexity of the program and there are many things that one can do using only pointers. Pointers are by no doubt a powerful C construct.

Wednesday, October 5, 2011

Some details about Pointers to Arrays in C

A pointer is a variable that holds a memory address, usually of another variable in memory. The pointers are one of the most powerful and strongest features of C language. The correct understanding and use of pointers is critical to successful programming in C. pointer’s support C’s dynamic memory allocation routines. Pointers provide the means through which the memory location of a variable can be directly accessed and hence can be manipulated in the required way. Lastly, pointers can improve the efficiency of certain routines. Arrays and pointers are very loosely linked. C treats the name of array as if it were a pointer.
Consider the following code snippet:

Int *a ; // a is a pointer to an integer
Int age [10] ; //age is an array holding ten integers
For (int I = 0; I < 10 ; I ++)
a = age ; // makes a to point to the location where age points to. Age is a pointer pointing to age [0].

In the above code a is a pointer and age is an array holding 10 integers. The pointer a is made to point where age is pointing to. Since the name of an array is a pointer to its first element, the array name + 1 gives the address of the second element of the array, array name + 2 gives the address of the 3rd element, and so forth.

Pointers also may be arrayed like any other data type. To declare an array holding 10 integer pointers, the declaration would be as follows:

Int *ip [10] ; // array of 10 int pointers

After this declaration, contiguous memory would be allocated for 10 pointers that can point to integers. Now each of the pointers, the elements of pointer array, may be initialized. We can use the following statement:

Ip [3] = &a ;

To find the value of a, you can use the below given statement:
*ip [3] ;

The name of an array is actually a pointer to the first element of the array, the same holds true for the array of pointers also. Most often, an operation is carried on successive elements of an array. Using a loop for it and using the array elements indices. Consider the following code fragment that initializes an array to 0:

Const int abc = 20 ;
Int arr [ abc ] ;
For ( int I = 0 ; I < abc ; i++ )
Arr [ I ] = 0 ;

To execute the above code snippet, the compiler computes the address of array [ I ] every time by multiplying the index I by the size of an array element. That is, the compiler performs the multiplication for each element. A faster alternative would be to use a pointer as shown below:

Const int abc = 20 ;
Int arr [ abc ] ;
Int * arr2 ;
For ( arr2 = arr ; arr2 < &arr [ abc ] ; arr2++ )
*arr2 = 0;

Now the compiler only needs to evaluate a subscript once, when setting up the loop, and so saves 19 multiplication operations. So it is faster to use an element pointer than an index when you need to scan the arrays in a program. Pointers in c are defined by their data type and values. The data type determines the increment or decrements of the pointer value. The value is the address of the memory location to which the pointer is pointing. If you are using array notation, you don’t need to pass the dimensions.

Tuesday, October 4, 2011

Concept of Project Scheduling - What is the root cause for late delivery of software?

After all the important elements are defined for a project, it is now time to connect all the elements. It means a network of all engineering tasks is created that will enable you to get the job on time. The responsibility for each task is assigned to make sure that it is done and adapt the network. The software project managers does this at the project level and on an individual level, software engineers themselves.

Project scheduling is important because there are many tasks running in parallel in a complex system and the result of each task performed has a very important effect on the work that is performed by other task. These inter-dependencies are very difficult to understand without project scheduling.

The basic reasons why software is delivered late are:
- Unrealistic deadline by someone outside the software group.
- Changing the requirements of customer and not reflecting them in schedule change.
- Underestimate of amount of effort and number of resources required for the job.
- Non considerable predictable or unpredictable risks.
- Technical difficulties that are left unseen.
- Human difficulties that are left unseen.
- Lack of communication or mis-communication among project staff.
- Project management is not able to judge that project is falling behind schedule.

The estimation and scheduling techniques when implemented under constraint of defined deadline gives the best estimate and if this best estimate indicates that the deadline is unrealistic, the project manager should be careful from undue pressure.

If the management demands that the deadline is unrealistic then following steps should be done:
- A detailed estimate is made and and estimated effort and duration is evaluated.
- Develop a software engineering strategy using incremental process model.
- Explain to the customer the reasons why the deadline is unrealistic.
- An incremental development strategy is explained and offered as an alternative.

Monday, October 3, 2011

Automation testing - Can sometimes not work inspite of all efforts, or take much more time ..

Doing an automation project can be sometimes fairly easy, it is just a simple matter of creating an objectives document, creating an execution plan, budgeting for the resources, making sure that the people committed to doing this are on the job, and that the plan is doing well. In a majority of cases, the project runs as per the schedule and the automation project gets completed.
However, this need not happen every time. Like any other project, there can be cases where the project runs into a lot of trouble or where there is something new being attempted, and the going gets rough. I have a personal experience of the same.
We had a project where we running into a shortage of resources for a testing case, and the case seemed to one where the testing was of a repetitive nature; hence, the project seemed to be one such where if we could setup an automation project, it would meet all the mission objectives. So, we got a person who was an automation expert, worked out all the objectives, worked out an execution plan along with a schedule, and started work.
We soon ran into problems that would disturb projects where the work is of a sort that was not done before. The project involved a situation where a large DVD was needed to be tested regularly. Each DVD that was manufactured had a small customization for individual clients, with the changes between the individual DVD's being very small. However, each DVD was needed to be tested thoroughly since each DVD was sent to individual clients, and it was not acceptable that any of the clients received a non-functioning DVD. The DVD needed to be put on a fresh machine, virus tested, the customization as well as the functionality of the application needed to be tested. The attempt was to create an image where many of the testing situations (including a virus check) were inserted, so that the test cases could be run automatically with a single resource just coordinating the work, and noting any errors if produced.
However, we ran into errors on many of the steps, since there did not seem to be anybody in the company who had done these sort of automation work before, and research on the internet did not seem to work either.

Sunday, October 2, 2011

Software test automation does not come free - you need to plan for it and budget for resources

I have heard a number of people talk about automation and the benefits it brings to the development team. Sometimes, there is casual talk about how a team can bring about a lot of benefits through the process of doing more automation. Now, it is hard to disagree with this thought. But, you cannot just say that you need to bring in automation and then expect it to happen. It was interesting what happened in one particular case - the team had made a request to put in an automation effort and had asked for some resources for the same; with a proper implementation plan, the resources were granted. However, in the midst of the effort, there was an urgent need to pull in resources for some other effort, and the automation resources were directed to another project.
Now, this sort of thing happens from time to time, and it is perfectly legitimate to prioritize resources when there is a need. But it is also necessary that expectations are then tempered when such changes in resourcing happens. In the current case, after some time, the management came inquiring about the automation effort, the status, and when the project will get completed. This was primarily because the automation effort had in turn promised to relieve some QE resources who were doing the tasks that automation had promised to solve.
This in turn lead to a discussion that got a bit heated where it was clear that even when the resources were diverted, there was an expectation that somehow the automation project would also proceed (maybe by making sure that people were working on this over the weekend or by dedicating much more time). At this, the team started getting heated since because of the overall tight scene, they were already putting in more time; at this heated discussion, finally the management understood that in order to get things done, they need to ensure that resources are in place.

Saturday, October 1, 2011

Estimation Techniques - For Web Engineering Projects

Early estimation is required during planning even though there is a huge chance that these are proven wrong. Some uncertainty is unacceptable and some solid techniques and concrete procedures help reduce the inaccuracy of estimates.

Estimating techniques for web engineering projects adapt the agile process model. Along with the agile estimation approach, a modified function point (FP) measure can be used to develop an estimate for a web application. Roetzheim suggests for web application estimation, the information domain values while adapting function points are:

- Inputs include maintenance screen, input screen or form or each tab using a tab notebook.
- Outputs include static web page, dynamic web page script, each report whether web based or administrative in nature.
- Tables include logical tables in database, each XML object if XML is used to store data.
- Interfaces are logical files into our out of the system boundaries.
- Queries are a message oriented interface and they are externally published.

According to Mendes:
The best way to determine the volume of the web application is by :
- predictor variables that are associated with application like page count, function count, media count,
- web page characteristics like page complexity, linking and graphic complexity,
- media characteristics like media duration,
- functional characteristics like code length.

Empirical estimation models for:
- total project effort
- page authoring effort
- media authoring effort
- scripting effort
can be evaluated by using these measures.

Facebook activity