Software can be thought of as going through a lifecycle, i.e. successive stages of development. The main stages are shown in the following diagram.
Each stage of the lifecycle can be automated to a greater or lesser degree. Automation can take the form of complete replacement of a manual process by an automated one, or collaborative sharing of work by different members of a team. In modern, mature software development teams, most processes are automated.
Automation Consultants has extensive experience of building and modifying automated development stacks made up of a wide range of different tools.
Requirements express what the software in question should do. In agile development they take the form of ‘epics’ and ‘stories’. Requirements management is automated through collaboration tools such as Atlassian Confluence and IBM Rational DOORS Next Generation. These tools allow different team members to write requirements and always to see the latest versions of their team’s requirements. Without such tools, requirements are typically written in a word processor and emailed among stakeholders, which is much less efficient. Additional features allow reviewing and approval of requirements and automated transformation of requirements into development tasks.
At the high level, ie. architecture level, Software designs are often conceived manually, although they are often stored and reviewed in collaborative tools such as Atlassian Confluence.
Software development is typically managed by collaborative project management tools, in most cases agile project management tools. The industry leader is Atlassian Jira Software. Each developer writes code in their own instance of an integrated development environment (IDE) such as Eclipse, Xcode and Visual Studio. Source code is stored in a source code repository which tracks the different versions of code as they are developed. The team’s code is stored in a central source code repository which, as well as tracking versions, resolves any conflicts which may arise from more than one developer working on the same piece of code. Developers’ IDEs are linked to one or more source code repositories. In some cases, developers commit code directly to the central repository. In others, they store their code in a local repository and periodically commit it from their local repository to the central repository. The leading source code repository is Git. Git itself is free and open source. Several vendors provide online or on-premise repository systems based on Git, including GitHub, Atlassian Bitbucket and Gitlab. Other source code repositories include Microsoft Team Foundation Version Control (TFVC), Subversion and IBM Rational Team Concert (RTC) source code control.
Software testing lends itself to automation, and is one of the first areas of the lifecycle to have been automated. Testing is commonly organised into phases, the most common of which are summarised below.
|Unit testing||Testing by developers of small units of code such as individual classes and methods.||Commonly automated with tools like JUnit. In some projects, unit testing of all code is compulsory.|
|System Integration Testing (SIT)||Testing by testers of the entirety of software product so far developed, using the interfaces (user interfaces and other interfaces)||Automation is very common in agile projects and less so in traditional (waterfall) ones. Automation’s primary benefit is in regression testing, i.e. re-testing of the whole product to ensure that new functionality has not broken the parts of the product that worked before, i.e has not caused them to ‘regress’. Tools like HP UFT, Rational Functional Tester, eggPlant and Selenium are used for SIT.|
|User Acceptance Testing (UAT)||Testing by end users of the complete software product, often just before delivery.||Mostly manual.|
Non functional testing such as performance testing is normally automated, using performance test tools.
Automated deployment is common in mature development teams as part of continuous integration / continuous deployment (CI/CD). CI/CD tools, such as Bamboo and Jenkins can store and execute the scripts required to build the software under development, and then deploy it to the desired environment(s). They monitor in real time the project’s source code repositories, and whenever new code is committed, they instantly build the code and deploy the resulting executable to one or more environments, ready for testing. They can then trigger a suite of automated tests, store the result of the tests and alert specified stakeholders to the tests’ results.
Once a software product is deemed fit for use it is released and goes into regular operation. The management of server based applications can be automated in many different ways. Automation is indispensable for organisations which manage large numbers of servers, such as the major technology companies, and is also extensively used by other large organisations and many smaller ones. The tools and techniques are broadly covered by the term DevOps. DevOps is a very large subject. Some very high-level highlights are given below.
|DevOps Techniques||Description||Leading tools|
|Virtualisation||Servers are virtual machines (VMs), rather than physical machines. That is, they run in software which simulates a physical server.||VMWare, Hyper-V|
|Containers||Similar to VMs, but more lightweight. They are optimised for running a single application and have much less overhead, making it often more efficient to run applications in containers than VMs.||Docker, Mesos|
|Container management||Tools for managing large numbers of containers.||Kubernetes, Docker Swarm|
|Infrastructure as Code (IaS)||Store entire suites of infrastructure, servers, networks operating systems and applications as code. The code can be run to create entire environments in minutes.||Terraform, CloudFormation|
|Configuration management||Store and manages the configuration of sets of servers. There is some overlap between configuration management and infrastructure as code, but in general, configuration management works at a lower, more detailed level.||Chef, Puppet, Saltstack, Ansible, Vagrant|
|Monitoring||Real-time monitoring of infrastructure and applications, combined with alerts triggered when predefined thresholds are breached.||App Dynamics, New Relic, Splunk, Dynatrace|