Wednesday, October 9, 2013

Integrated Software Development Factory: An Idea

Software Development: The Process


Software development and delivery process is the backbone of business for a professional organization in software industry. Software development is a team activity involving more than one professional with defined set of roles and responsibilities. The involvement of multiple people in the process requires a well defined work flow to be maintained. Apart from human resources the software development process (SDP) typically requires development software tools, platforms and hardware infrastructure and most importantly a strong collaboration mechanism within the team involving the artifacts of the delivery.  Ideally a software development and delivery process (as per the water falls model) involves certain technical steps or phases as briefly described below. Phases including financial, business and management activities such as scoping, estimation, planning are not included here.

Requirement Study & Analysis: Where a person (Requirement Analyst) interacts with the user or customer to understand the process and requirement that the software (to be developed) should implement. The information captured in this phase is generally captured in Software Requirement Specification (SRS). Test cases to validate the system (after development) are also defined following this phase.

Architecture & Design: Specifying and documenting the architecture and design for the software system to visualize the basic structure or model which should be followed to construct the software system. This phase can have two primary steps such as - 
·         Defining the business architecture or functional design by covering the business processes and logic
·         Defining the technical architecture or system design explaining the structure of system components required to implement the business processes.
Design and Architecture specifications are documented in this phase.
Development & Coding: In this phase, different software components are built or developed according to the design specified in the previous phase and tested. The outcome of this phase is source code and executable code.
Deployment & System Testing: All components developed are put together and tested to evaluate the ability of the system to provide the functionalities specified during the requirement capturing phase. Test cases defined during the requirement capturing phase are executed in this phase and test results are captured and defects found during testing are fixed.
User Acceptance: Once system testing is completed the software is submitted to the customer for final acceptance. This phase ideally have customer testing involvement. Defect fixing activities (if any) are also involved in this phase.
Operation & Maintenance: Once the software is accepted by the customer, it is finally delivered and installed for final use. In case any change in requirement takes place or any problems are identified by the customer after the delivery is done, necessary changes to implement new requirement or to fix problems are implemented in the system. In this case a new waterfall (starting with Requirement Analysis phase) can be followed for each new requirement or defect. Please refer to the waterfall model at http://en.wikipedia.org/wiki/Waterfall_model.
Monitoring & Tracking: Overall monitoring and tracking activities for the entire project are performed by a project manager (PM) throughout the phases of a software development lifecycle (SDLC).
The steps mentioned above are depicted in figure 1 below.
Figure 1: Software development lifecycle phases


Pain Areas in the Process


Æ      Majority of employees in a software development organization (SDO) are involved in the process of software development for customers. The development activities (projects) are performed by forming project teams consisting of different people. Typically a lead or manager is involved to monitor and track a project. Apart from the project team members (PTM) other stakeholders such as reviewers, users and customer also get involved throughout the lifecycle of a project. Nowadays most of the stakeholders come from different geographic locations even with different time zones. This is the reason why a project requires a strong collaboration mechanism to be in place.
Æ      Usage of standard practices, software tools and frameworks increases the efficiency of the software under development by reducing defects and improving performance, flexibility, extensibility etc. Enforcing standards and best practices over a team of people can be a challenge without a centralized control and strong collaboration.
Æ      The process of requirement study & analysis does not only involve human interactions, it can also involve several documents and pre-existing software systems as well. Sometimes existing source code from the previously existing system can also be taken as the input for requirement. Recovering the design and logic from an existing system or source code might need a reverse engineering mechanism to be in place.
Æ      Proper event tracking technique always helps in getting everyone in a team notified about the latest updates and help them to react promptly.
Æ      The next problem commonly faced is increasing gap in communication which often results in a big difference between the requirement and the development software system. Figure 2 illustrates the same with a popular cartoon. Usually this problem leads to wastage of investment and following rework.

Figure 2: Gap between requirement and implemented system

Æ      Misunderstandings in certain areas of requirement between a person with and without software background create major problems in communication as illustrated by the famous Dilbert Cartoon in figure3. Ideally a predefined flow of communication and precisely designated requirement capturing interface with relevant questions and clarifications can help in reducing such gaps. Educating the stakeholder (without software background) a little also helps here.

Figure 3: Misunderstanding in requirement capturing

Æ      Communication Gaps can exist between the requirement analyst (who understands the requirement from the customer or user) and the architect or designer which can be minimized by recording requirement with all necessary information which can help the architect or designer. Similar gaps can exist between designer and developer which lead to defects introduced during development phase.
Æ      Sometimes manual effort spent in build, deployment and installation procedures leads to human dependency. This process can be made automatic and time-driven with the help of a Continuous Integration (http://www.thoughtworks.com/continuous-integration) technique.
Æ      Rather than putting the test cases in document only and executing manually during the testing phase, Test Driven Development (TDD) Tools can be used to record the use cases and execute them automatically by integrating the same with Continuous Integration tools. Martin Fowler’s article (http://www.martinfowler.com/articles/continuousIntegration.html) on Continuous Integration explains this more clearly.
Æ      Overall a central repository with version control mechanism is a very important component to keep all artifacts which are referred (e.g. customer supplied documents) and produced (e.g. SRS, Design Document, Source Code etc.) during a project secured.

Goals to Achieve


The primary goal of software development process is to produce deliverables according to requirement with expected quality. The artifacts produced by a project which can be treated as deliverables are usually the SRS, architecture document, design document or source code etc. The final goal of a software development project should ideally be a working piece of software meeting customer’s requirement.
During SDLC, injection of defects is inevitable. Defects are introduced in different phases of a software development project such as Requirement Analysis, Design or Development. The impact of defects on delivery process and cost to fix them is directly proportional with time. The bugs discovered at the end of the SDLC would cost more to get fixed. So it is better, to find problems in the initial state of SDLC and fix them at the earliest. Based on a study (https://buildsecurityin.us-cert.gov/articles/best-practices/code-analysis/business-case), it has been found that, the savings potential from early defect detection is huge; nearly 60 percent of all defects usually exist by design phase.  Figure 4 shows how the cost to fix a defect increases with time.
There are certain techniques such as Pair Programming (PP), Continuous Integration (CI), and Test Driven Development (TDD) etc. which are found to be highly effective in catching the bugs early. While we think of an integrated software development environment (ISDE) as a solution, these techniques need to be considered as well. So we are assuming that, our solution will be equipped to facilitate such techniques. For this article, let’s assume a name for the solution as Integrated Software Development Factory (iSDF).

Figure 4: Increasing Cost to Fix a Defect with time

Integrated Software Development Factory (iSDF): In Search of a Pain Killer


A discussion on so many pain areas together is enough to get a strong headache for anyone. So if we quickly look for a pain killer, a solution to address all primary pain areas in developing a software solution or system, we need to map the resolutions of the pain areas as use cases to the pain killer. Let’s name this pain killer as Integrated Software Development Factory (iSDF). Typical use cases for iSDF deduced from the pain areas described above are the following.
·         Submit Requirement:  The software end-user or customer should be able to enter his / her requirement in our iSDF using a graphical user interface. The customer should also be able to submit associated documents supporting the requirement. The requirement will be stored in system and later referred by other involved in the project team. Once a requirement is submitted, all relevant stakeholders such as requirement analyst, PM and architect should be notified to take necessary actions to process the same.

·         Study & Analyze Requirement: The requirement analyst should have an interface to view the requirement statements and supporting documents entered by the customer for analysis. The analyst should also be able to interact with the end-user / customer for clarifications on the requirement. The analyst should be able to produce and submit an SRS document according to pre-defined format or template. Once the SRS is submitted, required stakeholders such as PM and architect should be notified to take necessary actions to process the same. iSDF should capture requirement in predefined format such as use case or user story so that other PTMs can refer to the same following a specific standard and paradigm (e.g. Object-Oriented Paradigm). Specially, the designer should be able to refer to the use cases or user stories by using a design tool integrated with iSDF. This will help in reducing the interpretation gap between requirement and design.
·         Define Architecture: iSDF should provide an interface for the Architects to view SRS and define the architecture for the software application based on the SRS submitted by the analyst. Relevant project members such as PM and architecture reviewer should be notified while architecture is defined and submitted in iSDF.

·         Review Architecture: Once the architecture is produced, a technical reviewer should be able to review the architecture and provide comments on the same. The architect will incorporate changes suggested by the reviewer (if any) and update the architecture document. Proper notification mechanism (to PM and Architect) should be in place on review comments submission.

·         Define Test Cases: iSDF should provide an interface for the Testers to view requirement and define required test cases for software application based on the SRS submitted by the analyst. Relevant project members such as PM, analyst and customer (if required) should be notified while test cases are identified and submitted in iSDF.

·         Review Test Cases: Once test cases are produced, a reviewer (ideally analyst or business users) should be able to review the test cases and provide comments on the same. The test case creator will incorporate changes suggested by the reviewer (if any) and update the test cases. Proper notification mechanism (to PM, analyst and other concerned members) should be in place on review comments submission.

·         Define Design: Once the architecture is finalized after review, the designer should be notified to start producing the software design. iSDF should provide an interface for the designer to view the requirement (in form of use case or user story), architecture and supporting documents such as SRS and architecture document. The designer should be able produce the software application design by using some design tools integration with iSDF and submit. Once submitted iSDF will store the design and relevant documents and notify the PM and design reviewer.

·         Review Design: Once the design is created, a technical reviewer should be able to review the design and provide comments on the same. The designer will incorporate changes suggested by the reviewer (if any) and update the design document. Proper notification mechanism (to PM and designer) should be in place on review comments submission.

·         Develop & Build: The next phase to design is development and build, which primary includes the generation of source code in desired programming languages, customization and configuration. The developers should be provided with proper interface (in iSDF) to be able to build or develop software applications to work in this phase.
Integrated development environments (IDE) like Eclipse and NetBeans are few examples of development tools which can be integrated with iSDF so that, design models (e.g. UML) can be viewed and referred using the IDE. Code generation options can also be integrated to generate code from the design models whenever required. The source code, configuration files and other associated artifacts produced during this phase should be stored in a centralized repository secured by a version control system such as Git, SVN and CVS etc. so that everyone in a development team should be able to share and update the source code as required.
An automatic build tool can be integrated with iSDF so that, the build process can be scheduled in a periodic manner or based on an event (such as on any update in source code repository). Usually this feature is available in typical Continuous Integration (CI) tools like Hudson, Apache Gump and CruiseControl etc. Once triggered by a time-driven or a event-driven approach, the scope of activities for a CI tool should be to check out the source code and configuration files from version controlled repository, compile and build the same, deploy the application on an execution platform e.g. an application server for a test tool to start testing.
Technical reviewers should be notified on any code change or repository update so that, the new code change can be reviewed. 

Figure 5: iSDF use cases


·         Review Code: Once a new code or modified piece of code or other artifacts are submitted in repository, a notification should be send out to assigned reviewer to review the new or modified artifact and provide comments or approve the change. Once the comments or approval is posted the concerned developer or changer should be notified by iSDF notification mechanism. For any clarification, an integrated collaboration mechanism can be used by the reviewer and changer if required. To support required activities during the review, a code review interface, a notification, a collaboration mechanism and workflow should be in place.

·         Test: This is an important phase in a SDLC. iSDF should have an interface for the testers to produce test cases associated with the requirement of a project during the requirement analysis phase. Once the development is completed, testers should be able to configure the test cases in automated testing tools integrated with iSDF. For example, Fitness is a very useful wiki based tool to implement Test Driven Development (TDD). Such tools can be integrated with the CI layer (within iSDF) so that, build, deployment and testing can be automated removing human dependencies. Once test results are produced, a notification mechanism can circulate the results to concerned parties (e.g. developer, project manager and tester etc.) for further actions.

·         Defect Tracking: Defects can be recorded and monitored using a Defect Tracking tool such as Bugzilla, Jira, Trac, Traxis and Mantis etc. In order to do this, iSDF should be integrated with a Defect Tracking Tool. While defects are introduced concerned parties can be notified by the system for further actions.

·         Deploy & Install: Different versions of application execution platforms or environments for development, testing, staging and production can be set up and integration with iSDF so that, once the application is developed and tested is can be easily deployed or installed on a designated execution environment. Developers can use a development environment to deploy and perform unit testing on their code. On completion of development and code review, individual code changes can be integrated and deployed on a testing environment for the testers to start testing. Once the testing is over, the tested application can be deployed on staging environment for customer’s acceptance testing or review.

·         Acceptance by Customer: Our iSDF solution should also provide an interface for the customers or business users to test and review the completed application and provide final acceptance or sign off. Typically, a staging environment and an interface to report defects are provided for customer acceptance testing. The defect reporting interface should have notification capabilities to keep the concerned parties informed.

·         Monitor & Track SDLC: Apart from an event based notification mechanism, iSDF should also provide a facility so that the entire SDLC followed in a project should be monitored and tracked by a project manager and other concerned stakeholders on a regular basis. Usually the progress of a project, issues and defects are the primary items of interest for monitoring.

·         Administration: Capabilities like User management, user authentication, authorization, project creation, project member allocation can be implemented as administrative activities required for iSDF.

Recipe of a Pain Killer: The Solution

In order to implement the abovementioned use cases certain technical capabilities will be necessary for our iSDF. These capabilities (listed below) together can be considered as a good recipe for iSDF.
*      iSDF should have a Web based Graphical User Interface or portal to be able to provide all user interfaces required for requirement submission, requirement analysis, collaboration and document management.
*      A Workflow Management Framework will be required to manage workflows and human interactions in terms of requirement analysis and reviews etc.
*      A Software Design Tool or interface should be integrated with iSDF so that, the requirement documents or SRS can be referred by the designer and design the software accordingly. Ideally a use case model prepared by the requirement analyst should be captured and shared among relevant users within iSDF in a predefined format so that the design tool can interpret the same as the starting point of design. Apart from preparing design models (e.g. class diagram, sequence diagrams and activity diagrams etc.), the designer can also prepare a design document and store the same in centralized repository of iSDF. The centralized repository can be controlled by version control systems to secure the documents.
*      A Code Generation feature can be added to iSDF to generate initial code structure from design. For example, once the designer completes class diagrams for an application and executes the code generator on the same, the code generator should be able to read the class diagrams and generate initial source codes in desired programming languages (e.g. Java, C++, C# etc.). Once the initial source code structure is generated, they can be stored (checked) in a version controlled repository for reference later by the developers.
*      Development Tools or environments can be integrated with iSDF, where developers can check out the existing source codes from version controlled repository, modify the code, compile and check in the modified code back in the repository. Once there is an update in source code repository, an automatic event or notification should be generated in iSDF that should trigger the build process (through a CI tool).
*      A Reverse Engineering facility of iSDF can help in generating design models from code (in case existing source codes are referred as requirement artifacts). For example, class diagrams can be generated from Java source code.
*      A Reusable Component Repository (containing standards, frameworks, reusable code etc.) should be available with iSDF for the designer, architects and developers to refer to and reuse during architecture definition, design and development.
*      An Email Notification mechanism to notify members involved in a project or administrator whenever there is a change in repository. For example, the PM and requirement analyst should be notified whenever the customer or business user submits a requirement. Similarly architects, designers should be notified whenever the SRS is finalized and code reviewers should be notified once there is an update on source code.
*      A Collaboration Framework for the geographically distributed members to collaborate within each other during a review, analysis and general discussions. The mode of communications can be implemented through chat, email, desktop sharing and video chatting etc.
*      A Continuous Integration platform or tool to automate build, testing and deployment processes should be implemented in iSDF. This is make the process of compiling, building source codes and deploying application packages on desired execution platforms e.g. application or web server etc. Once an update is made on source codes by the developers and automatic event will be generated which will trigger the CI tool to start the build and deployment process. Figure 6 depicts  a typical continuous integration process.
*      A Build Tool should be provided as an integrated feature of iSDF. This tool should ideally be integrated with the CI component so that, whenever there is an update in code repository this tool can be automatically invoked based on an event. On invocation, the tool should be able to check out the latest source code changes from the code repository, compile, build and deploy the same on an execution platform (e.g. application server) for execution. Some popular build tools used nowadays are Apache Ant, Apache Buildr, Apache Maven, Cabal, Gradle, Bamboo etc.
*      Integrated Testing Tools for software application testing should be provided as an important feature of iSDF. The testing tools which can implement a test driven development (TDD) process such as Fitnesse. It should provide the feature to configure the test cases and test data in it. The testing tool should be integrated with the continuous integration tool or platform so that, on each update in source code or application configuration, testing can be executed automatically and the results can be shared (using email) with appropriate stakeholders. Ideally when the application is built and deployed on the execution platform (e.g. Application Server), the testing tool should start executing the test cases which were already pre-configured in it.

Figure 6: Continuous Integration Process

*      A Defect or Bug Tracker tool can be integrated with iSDF to manage and track defects. These tools can be integrated with iSDF to register and track bugs or defects found during testing. Monitoring and tracking of defect life cycle and maintaining a defect repository for further analysis are important aspects of this.
*      A User Authentication & Authorization mechanism to authenticate and authorize users (preferably directory service integration will be a modern technique for this) should be integrated with iSDF. This will enable security and restrict user access based on authority.
*      Reporting Tool is a significant component for any application software. For iSDF, the customer, project manager and other designated stakeholders can monitor and track the software development process by using desired web based reporting interfaces or dashboards.
Figure 7 shows the entire iSDF solution as conceptualized in this article.

Figure 7: iSDF Solution

References


1.     Waterfall model for project management and execution at http://en.wikipedia.org/wiki/Waterfall_model
2.     Continuous Integration technique at http://www.thoughtworks.com/continuous-integration
3.     Martin Fowler’s article on Continuous Integration at http://www.martinfowler.com/articles/continuousIntegration.html
4.     FitNesse, the acceptance testing framework at http://fitnesse.org/