Software Configuration Management Best Practices for Agile Teams
08 Sep 2014Introduction
Configuration Management (CM) is a wide-ranging discipline which helps in establishing and maintaining consistency of product’s performance, functions and its physical attributes (requirements, code, build artifacts, operational information) throughout software development life-cycle. With more people dependent on critical computer systems and need of rapid changes in software development cycles, role of CM has been realized even more. CM has been a vital piece in successful product development ecosystem. With advances in development models, tools, and technologies, CM has evolved rapidly within the past few years. In this research paper, various usage pattern of Software Configuration Management (SCM) and the best practices on SCM for Agile Teams has been analyzed.
Agile Configuration Management
With successes of agile based projects and mainstream popularity gained within the industry, more companies are transforming towards Agile Development Model for the ultimate choice for software development process. As with Agile software development process, it is very important that configuration management is tailored accordingly to support rapid iterative development for successful delivery of the product. For successful agile delivery, pragmatic approach on configuration management plays a vital role in overall success of the project. Key functions of Configuration Management can be broken down into following:
- Change Identification
- Change Control
- Status and Accounting
- Audit & Review
With regarding Agile Configuration Management (ACM), main goal of an ACM is to rapidly build, package and deploy applications providing key core functions of a CM system. ACM makes sure the processes placed are robust, reliable and consistent (repeatable) to support the agile development process. Agile Configuration Management also ensures traceability and accountability for the change.
Characteristics of Agile Configuration Management are as following:
- Customer Focus
- Rapid Iterative Development
- Pragmatic approach to requirements
- Support for Testing
- Collaboration Communication
- Effective participation in SCRUM
Best Practices of Agile Configuration Management
Source Code Management
For an organization to fully control and regulate its configuration items, source code and other artifacts produced during development process, Configuration Management should provide Source Code Management (SCM). SCM is not only limited to version control, backup and recovery of the code but expands towards various processes and technologies used for effective management of source code to help improve quality of the code, effective productivity of the team and provide complete trace-ability of source code. With SCM, it is also ensured that code and other important work items produced during software development life-cycle are never lost.
Baseline
Creating baseline on codebase helps to pin point which version of code went in for a particular release. It also helps in tracing the changes in agile delivery, so that if a fix is needed for a change, CM can easily identify the change without any chance of the code regressing. Using immutable tags/labels on the baseline also helps to provide information on code at certain point of time. Usually releases are baselined with unique release set number.
Sandbox
Sandbox is local private workspace for the developer. It consists of source code the developer is editing locally, locally built components and build scripts to build the system. Using various sandbox in development environment helps developers organize work. Source Code Management provides isolation of environment through sandboxes to control delivery and acceptance of changes to the environment.
Branching / Merging
With modern source code management tool, using branches and merges in the code with parallel line of development helps to support multiple streams of development. Using multiple streams of development helps in improving productivity within the team and quality of code as well. Using effective branching and merging and techniques provided by modern source code management also helps in collaborative development for an agile team.
Build Engineering
To support rapid development cycles, it is important to build binary executables from the source code with confidence and repeatable way. Goal of build engineering is to be able to reliably compile and link source code into a binary executable in shortest possible time with high-quality code. Build engineering includes identifying compile and runtime dependencies and other specific technical dependencies. Build engineering improves both quality and productivity of agile development teams by providing accurate and repeatable way to compile and link the code. While designing a build, it is very important to architect build based on organizational need.
Continuous Integration
Continuous Integration (CI) is crucial for Agile Configuration Management (ACM). It attempts to build and deploy a code immediately after a developer checks in code. CI involves producing a clean build of the system several times per day. During process of Continuous Integration is followed by automated build and various tests to detect error at the early phase which helps in develop software more rapidly and robustness of the code. It is very popular in agile development teams.
Build and Build Automation Tools
There are various advanced build tools that helps in automating and cutting down build time using distributed build. Modern build automation tool also manage build dependencies and eliminate redundant tasks. Based on requirement right choice of build tool should be used for the project. Some popular build tools are: For Java – Ant, Maven, Gradle For C# - MS Build, NAnt For C/C++ - GNU Make Build Automaton Tools – Jenkins, Team Foundation Server, AntiHillPro
Release Management
Release management (RM) is a core function in configuration management that focus on packaging a system from promotion from development to QA to production. RM provides order to the release process, which is often in state of creative chaos.
Effective Communication
One of the crucial factor for a successful release is to have good communication throughout the lifecycle. RM should provide visibility into the status of a release. As part of release, Release calendar for should be communicated to all stakeholders to ensure the team is ready for the release. It is essential that everyone knows and has immediate access to reliable, auditable and insightful release information and key product information.
Environment Configuration
Environment Configuration refers to identifying, modifying and managing interface dependencies required for the system to successfully progress from development to QA to production. The goal of environment configuration is to point correct runtime resources and controlling their changes. Environment configuration helps manage deployment and release. With proper environment configuration intact, it helps support code promotion and rapid deployment across various environments, which is essential for iterative development.
Configuration Management Database
Configuration Management Database (CMDB) is a specialized information repository that contains details about Configuration Items (CI) and relation between CI’s. CMDB performs function of discovery and reporting back to centralized configuration management information system. CMDB helps in controlling environment configuration by storing all relevant information about component on the information system and presenting a view of the system. CMDB also helps to view relations and dependencies between various components of the system. CMDB is also a fundamental component of the ITIL framework.
Change Control
Change control is one of the most central functions of configuration management. Main goal of change control is to carefully manage all changes to environments. Adding change control guards unwanted changes or mistakes to the environment. Change control helps in successful running in daily operations, minimizes service disruptions and ensures service quality. Although it may sound contradictory when discussing about Agile and Change Control but in terms of successful agile delivery change should be delivered in controlled way and especially for enterprise agile teams where change is more widespread and high impact it is important to implement change control.
Change Control Board (CCB)
For enterprise agile teams there is usually Change Control Board (CCB) who reviews all requests for change and grants permission or rejects the request for the change. It is the responsibility of CCB to determine the impact dependencies with the requested change and do a risk assessment for the change and prepare a change plan. Emergency situations requiring immediate decision should also be accounted while setting process for change control. In many cases, either Senior Manager or director acts as an interim approver for CCB.
Deployment
The main goal of a deployment is to promote a release into desired environment (QA) or Production without any problem. It should happen seamlessly and if there is an issue with deployment it should be able to easily roll back. Deployment also helps to avoid un-authorized change to production code and also helps to know which version of code is in production.
Continuous Deployment
Continuous deployment is relatively newer concept started with agile development which focuses on small changes rather than larger deploy. It is based on continuous, successful and repeatable methodology to deploying code. It is heavily depended on automation to make the code run on production. It is gaining relative popularity among startup companies. In traditional release before reaching code to customer, it has to go through release cut, staging, QA, fixing bugs, and finally release which usually take 1-4 weeks but with continuous deployment it goes from development, to automated QA testing / Staging to deployment. It might sound not very intuitive but studies have shown that continuous deployment has improved quality of code.
Smoke Tests
Smoke tests are important in many levels to ensure application has not broken in any obvious way. During deployment process to verify basic functionality of the software system smoke tests must be run to catch “show stopper” defects. Smoke tests should not be exhaustive test. It should act as sanity check for the system before putting back to production usage. Smoke tests should be automated and quick to run.
Real Time Monitoring and Alerting
Even with best effort of the deploy process, bugs can still show up in an environment. It is essential to add real time system monitoring (CPU monitoring, Memory Utilization Monitoring) on the server and log monitors to know health of the environment. As part of continuous deployment it is a critical to have vital signs monitored and have fallback policy for bad deployments. It also helps in identifying issues which can be tracked, analyzed and assigned to corresponding support group.
References
- Aiello, B. a. (2011). Configuration Management Best Practices: Practical Methods That Work in the Real World. Upper Saddle River, NJ: Addison-Wesley.
- Dart, S. (1991). Concepts in configuration management systems. In Proceedings of the 3rd international workshop on Software configuration management (SCM ‘91), 1-18.
- Stephen P. Berczuk, B. A. (2003). Software Configuration Management Patterns: Effective Teamwork, Practical Integration. Boston: Addison-Wesley.