Close

Software Development

Modern practices and where it’s headed

As Atlassians, we've had the opportunity to interview thousands of customers about modern software development processes. This outreach has enabled us to uncover customer needs, pain points, and future plans in order to build our product roadmaps meaningfully.

What follows is an overarching summary and perspectives of the software development world, where it's heading, and best practices we've learned. To validate our findings, we surveyed software development leaders to understand which practices are at the heart of the highest performing teams.

01

What is Software Development?

Learn the fundamentals

02

The future of Software Development

Emerging trends such as feature flagging, continuous delivery, and others

03

A brief history of Software Development

Software development’s evolution throughout the 20th century

04

敏捷软件开发

Applying the popular management framework

05

Other Software Development Methodologies

Extreme programming, lean development, and the waterfall model

06

How (and why) to learn Software Development

How you can get started

01

What is Software Development?

Software is everywhere these days: phones, TVs, cars, vending machines, coffee makers, and pet toys all offer some software driven features. All of these products have been created by groups of people that have organized with the goal of making electronic signals behave in a desirable pattern. In short, software development is the overall process involved when taking a software project from conception to production delivery.

This process encompases the design, documentation, programming, testing and ongoing maintenance of a software deliverable. These various aspects are used to create a workflow pipeline, a sequence of steps that when followed produce high quality software deliverables. This pipeline is known as the Software Development Lifecycle.

The art of software development has many deep schools of thought. The following discussion is not a comprehensive guide, but a overview of the most recognized techniques. Software development today is generally executed with a complementary agile project management process. This process is in-effect during steps 3 and 4 from the Software Development Lifecycle.

A regular planning period is conducted in which expectations are set, dependencies are addressed and tasks defined. The tasks are executed and adjusted during a sprint period. During the sprint period these tasks are updated as they progress to completion. Specialized organizational software for task tracking, like Jira, is used to monitor the state of individual task within a holistic sprint view.

The Software Development Lifecycle

1. Concept
Projects are envisioned, designed, and prioritized. Confluence is a great tool to develop product research documents and share design files during this stage.

2. Planning/Roadmap
Stakeholders are identified, budgets set, and infrastructure requisitioned. Design documents from the concept phase are broken down into actionable tasks. Jira and Trello manage, track, and organize these task lists.

3. Code/Review/Test
Development teams work to build production ready software that meets requirements and feedback. CI/CD pipelines ensure efficient developer experience. Bitbucket offers collaborative code review tools and CI/CD pipelines which plugin to the code review process.

4. Deploy/Release and Hosting
With code approved and merged, it’s time to ship it. Bitbuckets CI/CD pipelines makes deployments as easy as clicking a button. The live production code will need a place to live. Consider using cloud hosting provided by Amazon AWS, Google Cloud Platform, or Microsoft Azure.

5. IT Support
Support and maintenance is required of active software projects. Jira Service Desk provides powerful tools to capture, triage, and resolve customer support requests.

6. Incident Management
Deprecation and end-of-life activities, including customer notification and migration are software development best practices.

The Software Development Lifecycle

1. Concept
Projects are envisioned, designed, and prioritized. Confluence is a great tool to develop Product research documents and share design files during this stage.

2. Planning/Roadmap
Stakeholders are identified, budgets are set, and infrastructure is requisitioned. Design documents from the Concept phase are reviewed and broken down into actionable tasks. Jira and Trello are used to manage track and organize these task lists.

3. Code/Review/Test
The development team works to produce production ready software that meets requirements and feedback. CI/CD pipelines are utilized to ensure efficient developer experience. Bitbucket offers code review tools which encourage iterative quality improvement through team discussion. Additionally, Bitbucket has CI/CD pipelines which plugin to the code review process.

4. Deploy/Release and Hosting
Once code has been approved and merged it’s time to ship it. Bitbuckets CI/CD pipelines can make deployments as easy as clicking a button. The live production code will need a place to live. Modern applications use cloud hosting provided by Amazon AWS, Google Cloud Platform, or Microsoft Azure.

5. IT Support
Ongoing support and maintenance is required of active software projects. Jira Service Desk provides powerful tools to capture and triage support requests.

6. Incident Management
Deprecation and End-of-life activities, including customer notification and migration. 

02

The future of Software Development

The immediate future of software development is directed by a few core values: automation, transparency, and democratization. Overall these trends are lowering the costs required to develop new projects and lowering the barrier to entry for non-technical team members to contribute to software development. 

The following practices have been adopted by some of the most successful enterprise software companies. Understanding how your team can use these practices to increase the speed of development can lead to a competitive advantage. These are the trends and practices that are enabling software companies to execute next level vision and delivery of product.

Feature flagging or feature toggling

Feature flagging is a practice which enables ‘soft releases’ of new code. Before feature flagging, teams would push entire features out to all production users as part of a regular code release. Feature flagging reduces the risk for deployments by allowing safe validation of features in a production environment before exposing them live to all live customers. Once a feature flag rollout has been successfully, privately, validated it can be rapidly rolled out and change live customer experience.

Microservices

Many modern networked applications have adopted a Microservices architecture (MSA) infrastructure. MSA is a distributed network architecture that enables horizontally scaling and network redundancy. A microservice implementation will break an application in to separate deployments that correspond to business needs. Some examples of these business needs are: payments, authentication, and analytics.

Functional programming – formally verified software

A reemergence of lost and under utilized functional programing paradigms from the last century is underway. A new generation of developers are rediscovering languages like Ocaml, Haskell, and Lisp.  Discussions are being had about mistakes in language design. Discussions like maybe Object Oriented Programming was a mistake.

Organizations are finding that higher quality, well designed, user empathetic programing languages can lay a foundation for higher quality, well designed user empathetic business product output. Functional languages can provide these higher quality offerings with features that lower the cognitive overhead of developers interacting and maintaining a code base. This leads to less bugs and higher quality software.

Formal verification is the process of proving or disproving the correctness of algorithms in an underlying system. It can be thought of as a mathematical process like verifying an algebraic expression. A formal property specification is provided for the algorithms implementation, and methods like static analysis can be used to prove the correctness of the implementation. 

From the idea of formal verification comes the radical idea that—maybe—code can write itself. Given a well designed up front formal business domain type specification and a soundly typed language. Generative tools can be used to write a code base that matches the formal specification. Languages like idris, coq, agda are exploring these ideas.

Continuous integration and continuous delivery

Continuous integration and Continuous development, are the premier examples of the value of automation.  CI/CD puts in place guardrails that allow developers to push new code and features that then automatically deploy to production environments. Before CI/CD gained popularity merging code and deploying were a much more cumbersome process. Teams would have to collaborate and sequence when to merge features and think about avoiding conflicts in code updates between team members. Deployments were risky affairs where teams would manually copy files between servers and the network could fail or desync a deploy across a cluster. The guardrails that enable CI/CD are version control systems, automated tests, and monitoring tools. 

Outcome-driven development

Outcome driven development is a workflow process that encourages rapid, lightweight software development. ODD defines goals instead of tasks and assigns ownership of those goals to a team which will be responsible for meeting that goal and implementing. If you’ve ever experienced a team planning meeting where the general consensus was “why are we building this?” It might be time to try outcome-driven development. 

Containerization

Containerization is an emerging trend that automates hosting and deployment responsibilities in DevOps (the automation of developer support duties like infrastructure management). Before containerization gained adoption developers would have no guarantees that their application would behave the same on different machines. Moving applications around between cloud machines or hosting providers was a risky and tedious move. Teams can now package complete system-level dependency stacks into a portable container which can then be initialized on any other machine.

Serverless-functions as a service

The rise of cloud hosted infrastructure has brought a new ease to deploying traditional server software stacks. This new hosting paradigm enables the direct upload and execution of individual code functions. A developer can write and upload a simple code function that takes input and returns output. The serverless platform will then expose this code function on a URL that can be accessed to utilize the function. This new process greatly simplifies the development-to-production release pipeline.

Feature flagging or feature toggling

Feature flagging is a practice which enables ‘soft releases’ of new code. Before feature flagging, teams would push entire features out to all production users as part of a regular code release. Feature flagging reduces the risk for deployments by allowing safe validation of features in a production environment before exposing them live to all live customers. Once a feature flag rollout has been successfully, privately, validated it can be rapidly rolled out and change live customer experience.

Continuous integration and continuous delivery

Continuous integration and Continuous development, are the premier examples of the value of automation.  CI/CD puts in place guardrails that allow developers to push new code and features that then automatically deploy to production environments. Before CI/CD gained popularity merging code and deploying were a much more cumbersome process. Teams would have to collaborate and sequence when to merge features and think about avoiding conflicts in code updates between team members. Deployments were risky affairs where teams would manually copy files between servers and the network could fail or desync a deploy across a cluster. The guardrails that enable CI/CD are version control systems, automated tests, and monitoring tools. 

Microservices

Many modern networked applications have adopted a Microservices architecture (MSA) infrastructure. MSA is a distributed network architecture that enables horizontally scaling and network redundancy. A microservice implementation will break an application in to separate deployments that correspond to business needs. Some examples of these business needs are: payments, authentication, and analytics.

Outcome-driven development

ODD is a workflow process that encourages rapid, lightweight software development. ODD defines goals instead of tasks and assigns ownership of those goals to a team which will be responsible for meeting that goal and implementing. If you’ve ever experienced a team planning meeting where the general consensus was “why are we building this?” It might be time to try outcome-driven development. 

Functional programming – formally verified software

A reemergence of lost and under utilized functional programing paradigms from the last century is underway. A new generation of developers are rediscovering languages like Ocaml, Haskell, and Lisp.  Discussions are being had about mistakes in language design. Discussions like maybe Object Oriented Programming was a mistake.

Organizations are finding that higher quality, well designed, user empathetic programing languages can lay a foundation for higher quality, well designed user empathetic business product output. Functional languages can provide these higher quality offerings with features that lower the cognitive overhead of developers interacting and maintaining a code base. This leads to less bugs and higher quality software.

Formal verification is the process of proving or disproving the correctness of algorithms in an underlying system. It can be thought of as a mathematical process like verifying an algebraic expression. A formal property specification is provided for the algorithms implementation, and methods like static analysis can be used to prove the correctness of the implementation. 

From the idea of formal verification comes the radical idea that—maybe—code can write itself. Given a well designed up front formal business domain type specification and a soundly typed language. Generative tools can be used to write a code base that matches the formal specification. Languages like idris, coq, agda are exploring these ideas.

Containerization

Containerization is an emerging trend that automates hosting and deployment responsibilities in DevOps (the automation of developer support duties like infrastructure management). Before containerization gained adoption developers would have no guarantees that their application would behave the same on different machines. Moving applications around between cloud machines or hosting providers was a risky and tedious move. Teams can now package complete system-level dependency stacks into a portable container which can then be initialized on any other machine.

Serverless-functions as a service

The rise of cloud hosted infrastructure has brought a new ease to deploying traditional server software stacks. This new hosting paradigm enables the direct upload and execution of individual code functions. A developer can write and upload a simple code function that takes input and returns output. The serverless platform will then expose this code function on a URL that can be accessed to utilize the function. This new process greatly simplifies the development-to-production release pipeline.

03

A brief history of Software Development

Software development has a surprisingly rich history.  The next section is a brief timeline showcasing the evolution of software development methods through the ages.

Prehistory

Before software development became a craft with a history and doctrine, the concept of software first needed to be created! The inception of software development is often traced back to Charles Babbage the mid-1800s. His analytical engine was the world’s first computer hardware. Software was delivered to the analytical engine through punch cards which denoted computations the machine would execute.

Countess Ada Lovelace is often credited with writing the first software algorithm. Lovelace was a mathematician and colleague to Charles Babbage. Between 1842 and 1843, Lovelace produced with an elaborate set of notes on the analytical engine. These notes contain what many consider to be the first computer program. She also developed a vision of computers to go beyond mere calculating or number-crunching.

Prehistory

Before software development became a craft with a history and doctrine, the concept of software first needed to be created! The inception of software development is often traced back to Charles Babbage the mid-1800s. His analytical engine was the world’s first computer hardware. Software was delivered to the analytical engine through punch cards which denoted computations the machine would execute.

Countess Ada Lovelace is often credited with writing the first software algorithm. Lovelace was a mathematician and colleague to Charles Babbage. Between 1842 and 1843, Lovelace produced with an elaborate set of notes on the analytical engine. These notes contain what many consider to be the first computer program. She also developed a vision of computers to go beyond mere calculating or number-crunching.

In 1936 Alan Turing invented the Turing Machine. A device which has two primary components: a strip of tape divided into cells and a head which points to the tape cells. The device can read or write to the tape cells and move the head to the next or previous cell. Turing later published a paper: “On Computable Numbers, with an application to the, which became the foundation of computer science. In the paper Turing presented that a Turing machine could solve any problem that could be described by simple instructions encoded on a paper tape. One Turing Machine could calculate square roots, whilst another might solve Sudoku puzzles.

 

1950s

Computers gained extensive adoption in enterprise business. The first standard software methodologies emerge; Study Organization Plan from (IBM) and Accurately Defined Systems from (NCR) Both companies publish printed books and distribute them to employees.

1960s

NATO held two Software Engineering Conferences in 1968 and 1969. The conferences were attended by international experts who agreed on best practices for software engineering. The conferences produced two reports that defined how software should be developed. 

In 1969 the U.S. Department of Justice filed an antitrust suit against IBM. This prompted IBM to decouple their software and service business from their hardware sales business. The “unbundling,” as its known, opened doors to independent software developers to compete in the space. This sparked a new era of software development patterns for both IBM and independent firms.

 
 

1970s

The first PC and PC software companies gain traction. A disruptive book, The Mythical Man-Month: Essays on Software Engineering, is published in 1975. The book is on software engineering and project management. Its central theme is that "adding manpower to a late software project makes it later.”

Structured programming, a precursor to Object Oriented Programming, rises in popularity. Structured programming aimed at improving the clarity, quality, and development time of a software project. Structured programming emphasized use of the structured control flow constructs of like (if/then/else) and repetition (while and for), functions, and subroutines instead of using goto statements and conditional tests.

1980s

Object oriented design takes foothold. “Monumental” methodologies like Waterfall and SDLC gain widespread usage. These methodologies are considered slow and ridged and appropriate for building monuments. 

 

1990s

The 1990s saw rise in management quality initiatives. Continuous Improvement methodologies like Six Sigma encouraged strict guidelines for quality assurance. TQM (Total Quality Management) and Capability Maturity Model are methods under the Six Sigma management.

The 90s saw the dawn of open source software. The GNU/Linux project brought about completely disruptive distributed team workflows and methodologies. Git was created to help manage these new distributed projects. Asynchronous communication over email and IRC.

Today and the future

Software development today primarily builds off the workflows established in the 90s open source world. Third party repository hosting services like Bitbucket have become central hubs for teams to use distributed asynchronous communication patterns around. Agile management methods are applied on top of these technologies to help coordinate and manage integration and release.

Today and the future

Software development today primarily builds off the workflows established in the 90s open source world. Third party repository hosting services like Bitbucket have become central hubs for teams to use distributed asynchronous communication patterns around. Agile management methods are applied on top of these technologies to help coordinate and manage integration and release.

04

敏捷软件开发

In 2001 a group of software developers frustrated with the existing cumbersome management system, gathered and published the the agile manifesto. The ‘Agile’ method is a largely popular modern software development paradigm.  Agile arose out of frustration for the ‘monumental’ methodologies of the past. Methodologies like Waterfall and TQM were born in the slower moving, less forgiving industries of physical goods manufacturing. 

Software is a much more forgiving and fluid end product than manufacturing. Agile takes advantages of these properties and provides a complementary management methodology.  Agile has been the driving force for development of the previously discussed features like CI/CD, Feature flags, and Microservices.

Adoption of Agile development practices has given rise to new disciplines of software development. DevOps is a modern field of software development which focuses on support and automation for supplementary software development tasks. DevOps teams are primarily tasked to support and improve software developer efficiency. DevOps teams build tools to automate and maintain mundane software development chores like infrastructure maintenance. 

Agile has been fantastic at optimising the development process. It has been so successful that Agile ideas and culture are continuing to expand to other areas of business like design and product development.

Learn more with comprehensive guides on:

05

Other Software Development Methodologies

Extreme programming

Extreme programming is a derivative of the Agile process. Extreme programing stresses customer satisfaction as the guiding force for development iteration cycles. Extreme programing follows a five step iteration cycle. The rules are Planning, Managing, Designing, Coding, and Testing. Learn more about extreme programing rules on the official extreme programming site.

Lean development

LSD or Lean Software Development is an evolution of lean manufacturing principles and practices. LSD is adapted from the Toyota Production System. it is emerging with the support of a pro-lean subculture within the Agile community. Lean offers a solid conceptual framework, values and principles, as well as good practices, derived from experience, that support agile organizations.

Waterfall model

The waterfall model is a development process that originated in the manufacturing and construction industries. It is a highly structured process that strictly restrains movement from one phase to the next. The motivation of this restriction comes from the prohibitively expensive phases of execution in physical environments. When applied to software these restrictions can feel draconian and counterproductive.   

Extreme programming

Extreme programming is a derivative of the Agile process. Extreme programing stresses customer satisfaction as the guiding force for development iteration cycles. Extreme programing follows a five step iteration cycle. The rules are Planning, Managing, Designing, Coding, and Testing. Learn more about extreme programing rules on the official extreme programming site.

Lean development

LSD or Lean Software Development is an evolution of lean manufacturing principles and practices. LSD is adapted from the Toyota Production System. it is emerging with the support of a pro-lean subculture within the Agile community. Lean offers a solid conceptual framework, values and principles, as well as good practices, derived from experience, that support agile organizations.

Waterfall model

The waterfall model is a development process that originated in the manufacturing and construction industries. It is a highly structured process that strictly restrains movement from one phase to the next. The motivation of this restriction comes from the prohibitively expensive phases of execution in physical environments. When applied to software these restrictions can feel draconian and counterproductive.   

06

How (and why) to learn Software Development

Learning software development can be a great exercise to open up new avenues for career growth. Being able to identify and discuss technical software development topics can improve your toolset in a software development organization.

A basic knowledge of software development is becoming more and more valuable. Understanding the design and implementation of how software works can help an individual operate more efficiently in personal and work life. Most modern business operations have some level of human-computer interaction. 

One of the best exercises for getting started is to observe, or participate in, a successful open source project, such as Git. These projects maybe identified from software you already use and enjoy. They will have guidelines to contributing and have open message forums to follow along with discussion and execution. Additionally, reading this document is already indication that you are ready to take the first steps and get started!

Software development is a technical craft with a steep learning curve and deep history. It can be intimidating for outsiders and newcomers to approach. Don’t let this deter you from learning either the basics and/or higher level topics—there are many resources online that offer guides on learning Agile development.

Up Next
Practices