How can you, as a technology leader, improve time to market for feature requests or new applications? If you increase the speed of development, does that negatively impact stability or introduce bugs? The answer to these questions is a proper software delivery process. This is not a one-size-fits-all band-aid. It’s a solution that can be customized to fit your specific needs and bring lasting improvement to your development teams.
At South Software Solutions we understand the intent behind these questions and the pressure to deliver quality software at speed. In this article we’ll share some insights to help you plan and execute your next software project faster with fewer bugs.
Learn about our Software Delivery Health Assessment Service
What is software delivery?
Software Delivery – the process of taking a software product from conception, to its deployment, and eventual maintenance.
Phases and Components of the Software Delivery Process
Requirements Gathering and Analysis
Gathering requirements is the most important step in the software delivery process.
Without proper requirements that have been well documented and signed off on by the project’s stakeholders, the project can’t even get off the ground.
There are several substeps to the requirements gathering process: identify the stakeholders, establish objectives, set requirements to achieve those objectives, and properly prioritize the requirements.
It’s a fact of life that it takes time to properly gather requirements. To cut corners here usually means increased development delays and costs. Incomplete requirements cause confusion and indecision, at best, and unusable/unnecessary deliverables at worst.
All that being said, too much time can be spent on requirements. You can only know what you can know. Sometimes it’s just best to get started. This is why it’s best to have high-level objectives for your project and gather requirements per objective. That way, you can gather requirements in an iterative cycle.
There’s a ton of project management software to choose from, I highly recommend finding something that works for your team and using it religiously. A deep backlog of work is always a good thing and will help keep you organized.
Design and Architecture Planning
Here, the software’s blueprint is created, encompassing the system’s structure, user interface, and data flow.
The deliverables from this step can be fairly general. It’s easy to get hung up in the weeds on implementation and forget about the architecture from a holistic point of view.
It can be really useful to get your stakeholders or engineers in front of a whiteboard and write design or architecture out. It doesn’t have to be fancy or artistic at this point. You are just trying to narrow down the technologies to use and come up with a reasonable design.
This can feel like an extension of the requirement gathering process. It is. This is the time to really flesh out your concept. A small POC (Proof of Concept) might be in order to sort out questions and the feasibility of your project. Be sure to update your requirements along the way.
Keep in mind the costs as you run through the design process. Consider licensing, hosting, and maintenance costs in the choices you make here. As the saying goes: “an ounce of prevention is worth a pound of cure.”
Schedule a discovery session now!
Find out how hiring a consultant can benefit your organization
Development
Now’s the time to put hands-on-keyboard and start implementing.
Keeping organized here can be challenging. Hopefully you have a full prioritized backlog of work prepared that your developers can pull from.
(An aside: a bunch of “number one” priority tasks is not good. It’s hard, but there needs to be a truly prioritized list.)
I’m a big fan of using Agile methodology.
In a nutshell “The Agile methodology is a project management approach that involves breaking the project into phases and emphasizes continuous collaboration and improvement. Teams follow a cycle of planning, executing, and evaluating.” – Altassian
These iterative phases allow your team to make meaningful progress quickly. With everyone working towards the same goal, even when the work is fragmented, they can celebrate wins and handle set-backs as a team.
It’s important to work towards the base functionality that would make up the MVP (Minimum Viable Product) or the MMP (Minimum Marketable Product). That is to say, what features are required to consider the project ready for a 1.0 release? Focus the team on the “must haves” and save the “nice to haves” for future feature releases. Again, priorities first.
Testing and Quality Assurance
As part of the Agile approach to software delivery, Quality Assurance (QA) is baked into the process. Product quality is not an afterthought or a separate step to complete after the code has been written; it’s an integral part of the development cycle.
Smaller development teams do not always have dedicated Software Quality Assurance Engineers. QA becomes the responsibility of the developers who are building the product. The way forward is through automated testing.
Automated testing is a broad term encompassing many smaller concepts, in this article we are going to be focusing on unit testing and end-to-end (E2E) testing.
Unit Testing
Unit testing is writing and running tests against the smallest testable components (or “units”) of the code.
For example:
A developer is adding a new feature which requires several functions to be written. Once they are complete, how does the developer know that they work? How can they be sure that this change didn’t break other parts of the code? This is where automated unit tests are valuable.
In this case the developer could write unit tests for each function. The tests would prove that each function, given the proper inputs, would return the expected outputs. They should also write tests that prove that the functions fail and log properly when unexpected inputs occur.
This may seem like a lot of extra code, and it is. Tests are often larger than the code they are testing. This is not a waste of time however.
Having a large test suite is a powerful form of insurance against errors and bugs. As the number of test cases grows, so can your confidence in the stability of your application.
Automated unit tests are not the silver bullet guaranteeing bug free code, but they are a huge step in delivering a stable product that meets the established requirements.
One thing to note: unit tests are not as simple as tacking on extra code to magically verify your app works. Test frameworks need to be set up and more importantly code needs to be written to be testable.
End-To-End Testing
E2E testing is a complicated beast. Nevertheless it’s an important component to nail down and can save a lot of future headaches (not to mention money).
With tools like the cloud, containerization and CI/CD (Continuous Integration/Continuous Delivery) pipelines, E2E testing doesn’t have to be a separate and time consuming process. It also doesn’t require a specialized team of test engineers. Now, this isn’t to say that it’s easy or intuitive. Creating and maintaining good test automation requires an unwavering commitment from the top down. There often is a lot of setup and work that goes into an effective test suite.
When E2E testing it’s important to remember a few best practices:
Remember the customer’s point of view – Put yourself in the shoes of your user. What are the “normal” pathways they follow when navigating or interacting with your application?
Write comprehensive user stories – Now that you are thinking like your end-user, write down these common interactions as user stories. These can help your team stay focused on the customer. User stories are not simply “features.” They explain the “why” and provide context for your developers.
Focus on the most common use cases first – It can be tempting to try and test every possible pathway and combination of how your application can be used, this isn’t necessary though. It’s important to first focus on the features that your users use the most. The classic 80/20 rule can apply here. Start with what 80% of users use most often and then move toward the remaining 20%.
Deployment and Release
Once your MVP/MMP is running smoothly it’s time to think about deployment.
Throughout the development process, you should be reviewing your business objectives and allowing them to guide the evolution of your application. Now is a great time to reference them again.
What is more important: a fast initial deployment that gets your app into the hands of your customers faster? Or, having a deployment pipeline that allows for frequent/constant releases?
One-off deployments can get you started, but a CI/CD pipeline that handles running tests, packaging, and deployments will carry you far into the future.
Imagine the labor involved in running the test suite, building/packaging the deliverable, and deploying it. Now extrapolate that out to multiple deployments a day. As you can see that really adds up!
Now you may be wondering – “won’t prioritizing the building of a full fledged CI/CD pipeline put my team behind schedule?”
The short answer is, yes it very well could.
This leaves you with two major options: you can hire a consultant to build it out for you, or you can build it yourself incrementally over time.
If you started building your CI/CD pipeline to take care of smaller tasks, like running tests, you will now have a great start on using it to manage your deployments. As you add new features to your development process, add the small amount of effort to follow through and update your CI/CD pipeline. You’ll be glad you did.
How does your software delivery process score?
Schedule a Software Delivery Health Assessment Today!
Maintenance and Support
So your team has completed all their deliverables and fulfilled every requirement. You’re done. Right?
Wrong.
The reality of developing software is that it is never really done. There is always more to do. Things like cleaning up tech debt (if your team managed to write an app without some tech debt then you deserve a medal), dependency updates, bug fixes, and feature releases will be around as long as your app exists.
This shouldn’t be discouraging but it should help set the expectation that there is always more to do.
Finding ways to capture user feedback and turn that into actionable tasks is going to be important in ensuring that your app stays relevant and usable as time goes on.
If your source code is publicly available then something like GitHub Issues is a great way to capture bug reports. Otherwise sending out surveys or even building a feedback mechanism into your application can be good ways to solicit valuable feedback.
The conversion rates usually aren’t great but some feedback is better than none.
Those same processes that you used to plan, prioritize, and execute features of your application are the same ones that you’ll use to address maintenance issues. As you get feature requests or bug reports they should be added to a backlog of work of which you and your team will prioritize and execute.
Preparing Your Software Delivery Process
In a study of large software projects by McKinsey, 48% of the projects that overran time and budget constraints did so because of poor planning. Things like: unclear focus, lack of business objectives, shifting requirements, and technical complexity.
“[…] half of all large IT budgets […] massively blow their budget. On average, large IT projects run 45% over budget and 7% over time while delivering 56% less value than predicted.” – McKinsey
Those are some scary numbers and illustrate exactly why proper planning is so important.
Unclear focus, shifting requirements, and technical complexity
Estimating the end date or milestones of a software project of any size can be extremely difficult. The larger the project is, the harder it becomes. This is why it’s critical to keep your project as small as possible.
This might seem counter intuitive. You have stakeholders and other external pressures to deliver a fully featured application quickly.
How can you deliver everything for everyone? How can you meet everyone’s expectations?
You can’t.
That may sound bad, but it’s true, you can’t make any real progress quickly when you have multiple number one priorities.
Over the years, I have frequently been involved in projects where the leader cannot decide what priority to take on first. I have felt the pain first hand, as a developer, when multiple number one priorities increase the pressure and slow progress way down.
Continual delivery has a couple key benefits. It allows you to make headway and show consistent progress. With this consistent progress, it becomes a lot easier to estimate future work.
The solution to the problem of multiple number-one-priorities is having detailed planning sessions with all the stakeholders present.
When everyone who is depending on functionality from your software application is present and has a voice at the table, it becomes everyone working as a team to further a common goal. Features can be prioritized together and everyone can come away with the same, reasonable, expectations. That is a beautiful thing.
Conclusion
In the landscape of modern business, the art of software delivery emerges as a strategic imperative. This comprehensive guide has navigated through the intricacies, highlighting that success lies in meticulous planning, collaborative efforts, and an unwavering commitment to continuous improvement. Software delivery is not a singular event; it’s a dynamic journey from ideation to deployment, presenting opportunities at every turn for refinement and enhancement.
Amidst the lines of code and algorithms, the human touch stands paramount. Effective communication, collaboration, and relationship-building are not ancillary; they are integral. Recognizing that a successful software delivery is as much about understanding human needs as it is about technological prowess is key. In this digital era, where change is the only constant, embracing an agile mindset, and being adaptable are indispensable for sustained success.
Business leaders navigating the complexities of software delivery need not traverse the path in solitude. Engaging with skilled software consultants is transformative; they offer not only technical expertise but a holistic understanding of the intricate interplay between technology and business objectives. This guide encourages a celebration of successes, a thoughtful approach to challenges, and a forward-looking perspective. Each software application created has the potential to redefine processes, elevate user experiences, and propel businesses to leadership in their industries. Mastering the art of software delivery is a journey of orchestration, resilience, and composing success in the dynamic symphony of technological evolution.