Software is integral to modern society, be it for business or leisure. From kids to adults, every individual relies heavily on technology backed by sound software applications and services for all manner of tasks. This dependency on technology comes from the assurance that the software applications and utilities are safe and reliable.
From the other perspective, software development is a rapidly evolving industry, due to this demand and existing gaps in the market. The competition is high, hence there are many companies trying to develop their own solutions to get a piece of the pie.
Unfortunately, a lot of dedicated efforts in software development go to waste. Studies indicate that over 80% of software development projects are unsuccessful due to wrong foresight, poor execution, budget and resource constraints, or incorrect functionality.
Luckily though, there are a number of success stories. Learning from the approach employed in them can be quite helpful in ensuring successful software development.
Whether developing a new software product, upgrading, improving, or maintaining existing software, it is beneficial to keep in mind the best practices compiled below.
Recruiting talent with the right skills and relevant experience is vital to ensure the project’s success. It is also important to allocate the right work to the appropriate person. Similarly, investing in tools that enhance efficiency and increase the team’s productivity is very important. The latest PCs, appropriate updated hardware, development and testing software and platforms, as well as automated tools will aid the team in putting their expertise to the right use and ensure a robust product.
The development life-cycle depends heavily on the process adopted. The waterfall model, agile methodology, iterative spiral approach are all proven ways of achieving success. Selecting the one that suits the specific project is of utmost importance. The actual adherence to and the application of the selected process is what plays out in the success of the project. It is often a good idea to make a small prototype to study feasibility or explore new technology.
Many projects fail or overshoot deadlines due to poor estimations. Sound planning depends upon accurate estimates for schedule, budget, resources, and efforts. It is best to use proven estimation techniques. Tweaking estimates to unrealistically short-schedule a project will most likely end in disaster.
Bigger projects and major milestones should be complemented with mini-milestones to offer better tractability, improved control, and better risk mitigation. Team stakeholders can sit side by side to discuss and align these mini-milestones with the bigger milestones to meet the overall schedule and reduce inter-dependency delays.
Effective requirement gathering forms the basis of aligning the finished product with the business objectives. Discussions and agreements on documented requirements between the stakeholders (customer, business leadership, and team lead for example) are imperative. There is a need to define primary, derived, and implicit requirements, both functional and non-functional. Functionality can be captured via use-case scenarios. Performance, fault tolerance, system, design, and architectural requirements should also be well-addressed.
A good system architect will ensure that the suitable architecture is selected, keeping in mind the requirements as well as the limitations and constraints if any. Best practices such as identifying the threats and anti-patterns in the system are very helpful.
Design should be modular and optimal. Balancing and distributing functionality over modules can make or break a project. The object-oriented approach is one such technique that ensures modularity. It is up to the designers to ensure that the selected approach is applied well so as to achieve “maximum cohesion, minimal coupling”. Code reusability is often an under-utilized aspect in design, which if leveraged well, can save a lot of effort and reduce costs in the long run.
Using smaller modules that are coded, self-tested, unit tested, and continuously integrated is a best practice that is used widely. Automating build tools and automated running of regression test suites for each included functionality is also recommended to ensure that existing functionality is not broken.
Test planning, test set creation, and testing are very important to validate the developed functionality. In fact, test planning should be independent of coding and can be done in parallel to the coding stage. Equally important tests reporting, effective defect reporting, defect tracking, and defect resolution. The use of automated tools as well as well-established processes for these will ensure that bugs are caught at the earliest possible stage and resolved cost-effectively. Unit testing, integration testing, functionality testing, system testing, and performance testing are some of the levels of testing. Each level requires its own expertise, planning, and execution.
As important as the actual software itself, are the documents that support it –project plan, requirement specifications, High-Level Design (HLD), Low-Level Design (LLD), test plans, test reports, status reports, and user documentation. Many a time, these documents are a part of the deliverables specified by the customer or stakeholders as well. These documents help to maintain an understanding of the software, ensure trackability, and remove dependency upon the core development team. They can be used as a reference in the future by someone else, who might work on or use the software.
Reviews are found to be as effective and, in fact, much cheaper in catching defects than testing. Reviews of all deliverables, code, and documents must be done. Review planning, management, and conflict resolution use a number of established techniques and best practices. Peer reviews, as well as expert reviews, are very useful.
Using effective management for source code and all the documents, so that they are version controlled, is essential to maintain tractability, back-tracking and controlled rollback, if necessary. There are many readymade tools available for this purpose as well.
Effective quality control aids in the smoother and faster execution of the development project. From efficient tool-based defect tracking to quality metrics, best practices have proven successful in judging the readiness of the project for subsequent stages or delivery. Metrics and targets can be set to ensure that the requirement, design, code, test plan, and other deliverables and documents are dependable. In fact, quality representatives and quality analysts are key skilled experts that some organizations hire, who help to audit the projects for quality.
There are a number of times when successfully lab-tested projects fail during actual installation and deployment. Effective deployment plans and a deployment checklist can be used to avoid such disasters.
Even while the deployed software is operational, established processes and practices must be in place to support user problems and report them back to the maintenance team effectively. Customer resolution software and defect tracking mechanisms are vital here.
Effective project management and leadership lead to accountability and support for the team. The project manager can facilitate effective planning, tracking, budgeting for the project and also ensures that appropriate resources are made available to the team. Risk management and process adherence are also achieved through good project management.
It is a good practice to track the man-hours of every individual within the team. These can be mapped to the estimated and planned hours and then used for fine-tuning and better risk management. The mini-milestone planning along with effort tracking can provide good feedback and status tracking for current as well as future projects.
It is almost certain that requirements may change while the project is in development or is deployed. This could be due to a change in user/customer’s expectation, change in business needs, or simply failing to predict a problem at the right time. Instead of resisting the change, it is necessary to allow for a control mechanism to accommodate the necessary changes without impacting the existing functionality adversely. Having a CCB (Change Control Board) is one such successful method to accept or reject changes and facilitate the smooth inclusion of the change into the schedule and plan.
Defining parameters for success and agreeing on them with the customer at the time of project planning or deployment is essential. It is important to have effective measuring mechanisms to match the performance against these defined targets. A popular parameter is the SLA (Service Level Agreement). Another standard is the CMM (Capability Maturity Model) that measures the maturity of the software development of your organization and can help you identify the weaker areas that need improvement and help grow your business based on your CMM level certification.
Improvement is a continuous process and should therefore be integrated into the ethos and culture of the company and the software development cycle itself. A successful new strategy invented in one project will benefit future projects as well. Hence, it is very important to share the lessons learned and train the stakeholders to learn and adapt to better ways of working.
The above are some of the best practices that span most of the software development projects.