DevOps has become one of our industry's most popular buzzwords. Yet, surprisingly, there is little consensus as to what DevOps means beyond the high-level vision of tighter and more effective collaboration between development teams and operations teams. While DevOps might mean different things to different organizations, there is an emerging core of best practices that further its goals of enhanced collaboration to produce better software. I examine these practices here. Fair warning, though, I'm not just looking at this issue from the point of view of developers.
I've listed these items in priority order, with later practices often depending on those that come before.
Practice 1: Active Stakeholder Participation
A fundamental philosophy of DevOps is that developers, operations staff, and support people must work closely together on a regular basis. An implication is that they must see one other as important stakeholders and actively seek to work together. A common practice within the agile community is "onsite customer," adopted from Extreme Programming (XP), which motivates agile developers to work closely with the business. Disciplined agilists take this one step further with the practice of active stakeholder participation, which says that developers should work closely with all of their stakeholders, including operations and support staff--not just business stakeholders. This is a two-way street: Operations and support staff must also be willing to work closely with developers.
Practice 2: Automated Testing
Agile software developers are said to be "quality infected" because of their focus on writing quality code and their desire to test as often and early as possible. As a result, automated regression testing is a common practice adopted by agile teams, which is sometimes extended to test-first approaches such as test-driven development (TDD) and behavior-driven development (BDD). Because agile teams commonly run their automated test suites many times a day, and because they fix any problems they find right away, they enjoy higher levels of quality than teams that don't. This is good news for operations staff that insists a solution must be of sufficient quality before approving its release into production.
Practice 3: Integrated Configuration Management
With an integrated approach to configuration management (CM), development teams not only apply CM at the solution level as is customary, they also consider production configuration issues between their solution and the rest of your organization's infrastructure. This can be a major change for some developers because they're often used to thinking about CM only in terms of the solution they are currently working on. In a DevOps environment, developers need to be enterprise-aware and look at the bigger picture. How will their solution work with and take advantage of other assets in production? Will other assets leverage the solution being developed? The implication is that development teams will need to understand, and manage, the full range of dependencies for their product. Integrated configuration management enables operations staff to understand the potential impact of a new release, thereby making it easy to decide when to allow the new release to occur.
Practice 4: Integrated Change Management
From an IT perspective, change management is the act of ensuring successful and meaningful evolution of the IT infrastructure to better support the overall organization. This is tricky enough at a project-team level because many technologies, and even versions of similar technologies, will be used in the development of a single solution. Because DevOps brings the enterprise-level issues associated with operations into the mix, an integrated change management strategy can be far more complex, due to the need to consider a large number of solutions running and interacting in production simultaneously. With integrated change management, development teams must work closely with operations teams to understand the implications of any technology changes at an organization level. This approach depends on the earlier practices of active stakeholder participation, integrated configuration management, and automated testing.
Practice 5: Continuous Integration
Continuous integration (CI) is the discipline of building and validating a project, through automated regression testing and sometimes code analysis whenever updated code is checked into the version control system. CI is one of the sexier agile development practices (at least from a developer's perspective) that is typically associated with DevOps. CI enables developers to develop a high-quality working solution safely in small, regular steps by providing immediate feedback on code defects.
Practice 6: Integrated Deployment Planning
From the point of view of development teams, deployment planning has always required interaction with an organization's operations staff; in some cases, via liaison specialists within operations typically called release engineers. Experienced development teams will do such planning continuously throughout construction with active stakeholder participation from development, operations, and support groups. When you adopt a DevOps strategy, you quickly realize the need to take a cross-team approach to deployment planning due to the need for operations staff to work with all of your development teams. This isn't news to operations staff, but it can be a surprise to development teams accustomed to working in their own siloed environments. If your team is not doing this already, you will need to start vying for release slots in the overall organizational deployment schedule. Furthermore, to support continuous deployment, release engineers will need to increase the number of release slots available to agile teams that are disciplined enough to continuously and consistently meet the quality requirements for release.