Simple Isn’t Easy | The Hidden Complexities of App Development
Let us dispel a couple of misconceptions related to software development that seem to be fairly common. These concepts are:
There are two primary methodologies for software development, Agile and Waterfall. While there are other methods, Agile and Waterfall are probably the most common. Agile is a more general term to describe a method of iterative development. Several processes fall under this description, SCRUM being one of them. Waterfall development is a linear approach and has been around a bit longer, there are many forms of Waterfall development as well, but they all follow a pretty similar process.
There are tons of opinions out there when it comes to which methodology is best. I have been working in various positions (product manager, project manager, technical sales, technical support, etc.) for over 20 years with a few different companies and have had extensive experience with each development method. Some people have a strong preference for Agile or Waterfall and expound all the benefits of their preferred method. I do not have a preferred method and I think each has its place and advantages/disadvantages. Some might say Waterfall is the old way of doing software development and Agile is a more modern way. I say that Waterfall may be older, but it is a proven method to get a predictable result.
Waterfall is a linear or sequential development process. When using a Waterfall process, there are several phases of the project that are dependent on each other.
The crux of the Waterfall method is that each of the above phases is very reliant upon the preceding phase. You cannot start one phase until the preceding is complete. Each phase is also very dependent on the preceding for success. If you do not have a complete requirements document, you will not get the feature you need in the UI designs. If the feature is not in the UI design the developers will not build it.
The name Waterfall refers to the importance of each step of the process. It is critical to carefully review and complete each step prior to moving the next stage. It is very difficult and can be both time consuming and costly if you must go backward during the process. For example, it may be difficult to add in functionality missing from the scope after the app is coded.
Imagine a waterfall containing several pools (requirements, design, develop, test), each overflowing into the next downstream. It would be difficult for a fish to swim upstream from the lowest pool to the top. So, if you miss something in requirements gathering it can be difficult to add if it is not caught until the QA process (Alpha Build).
Agile is a term to describe a more iterative approach to software development. Contrasting Agile to the more monolithic Waterfall approach, with Agile you build an application in small, usable chunks instead of building the whole application at once. Agile projects are developed in small iterations often called sprints. You can think of these small iterations almost like mini-Waterfall projects. During an iteration, requirements are gathered, estimations developed, UI/UX design and development performed and QA tests the output.
At the end of an iteration, you have a small piece of the application that functions. Stakeholders can then test and give feedback on each piece. The feedback gathered at the end of the iteration drive product direction for future iterations.
An agile process also begins with requirements gathering and planning. However, this phase is a little more flexible. The product is expected to change throughout the development cycle. It is less critical to detail all requirements and specifications in advance. The process is flexible by design. Making changes to the application as it is developed is part of the plan.
Once you have a high-level plan for the application the iterative process starts. Each iteration can last from 1 to 4 weeks until the next begins.
The main idea behind Agile methods is flexibility. In contrast to Waterfall, Agile incorporates user feedback into the development cycle. User and stakeholder feedback given during the development process helps form the application. It is expected that additional requirements will be uncovered during the development process and these changes can be incorporated into the application. There is no penalty for making these changes as you go.
Well, in my opinion neither is better. They are different and each has their place. Each methodology has its own strengths and weaknesses, which fit them to certain types of projects.
You can make changes all throughout the process and every feature/requirement need not be set in stone from the start. Also, the release date can be more flexible. Instead of waiting for the planned “finish” date, you can release the application when it has enough functionality to be valuable.
The needs of the stakeholders and end-users drive the features and functions of the application. Each iteration builds off of the feedback provided at the end of every sprint.
During the process, all stakeholders know exactly what has been built and what remains.
Testing is continuous through each iteration of the application. Because of this, it is easier to catch bugs and increase the quality of the end product.
Most Agile methods use self-organization and regular, short meetings the teams tend to be motivated to produce quality work in a timely fashion.
Works well for large projects.
From the start, you know the outcome of the Waterfall process. You can constrain the project to a predictable cost and timeline.
Waterfall has a well-documented process, proven results, and avoidable ‘gotchas’ because it has been around for a long time.
Using standard project management techniques such as milestones and dependencies, the process can be easily managed for a predictable result.
Waterfall works well for projects with known and boxed-in requirements.
The process has little overhead and can deliver a product quickly.
Works well with small/short projects.
Both methods have their disadvantages as well. Interestingly, most of the disadvantages of one method are strengths for the other.
This is in terms of budget and release timeline. Because the method provides the opportunity to define the application as you build, it is difficult to constrain the project to a fixed budget. When you don’t have a fixed set of features and functions defined, it’s hard to predict when the application will be ready for release.
With each iteration there is planning, estimating, testing, reviewing, etc. This adds some managerial overhead to the process as the development team is shifting gears more frequently instead of being “head down” coding for a longer period. Each iteration involves more meetings. Because of this, it also does not work well for smaller projects.
There are several forms of Agile development. Some are more established and defined, others are less defined. Often a “by the numbers” SCRUM process does not work well (especially for remote teams). Your organization would need to modify the process to meet your requirements.
Standard project management techniques do not work as well in Agile. It takes a strong understanding of the process by the project manager to successfully manage. It also demands a strong product owner and can be problematic if you have several stakeholders acting as a product owner.
Waterfall locks you into the product requirements from the beginning. It becomes costly to make changes to the application after designs are complete.
When a waterfall project goes into the development phase it is a bit of a black box. Once the application is in development, stakeholders do not really see the application until the first alpha release.
The Alpha phase is typically full of bugs. This is not really a problem because the QA stage will find and resolve most issues before a production release. But when the stakeholders first get to see the product it can appear to be of poor quality because of the lack of testing.
It does not work well for applications that are not well defined or boxed in. This can be difficult, especially with larger projects.
As you can see the benefits and detriments of each method can help make it clear which types of projects are best suited for each method. There is one more important consideration when it comes to starting a new development project, that is the type of development agreement you would like.
Because of the way each of these development methodologies works, when you choose a method you will also need to consider the type of development agreement you would like as well.
When entering an agreement with a development organization you will have two primary types of agreements. A fixed cost agreement is based on a scope of work. The scope specifically states exactly what will be built and a cost (not to exceed) for the development. A time and materials (or hourly) agreement will also typically provide a scope of work, but the cost will be an estimate or an estimated range. Both agreement types are suitable for software development projects and have their own set of advantages and disadvantages. A fixed cost agreement works well if you are going to use a Waterfall development methodology, however, it probably won’t work for an Agile project.
It’s all about risk. When a development organization estimates any software project there is an element of risk. Estimation is a bit of an art and there is no way to guarantee that an estimate for a project will be exact. A well-defined project, fixed set of requirements (Waterfall), and few integrations with other applications reduces risk. If you still have to determine the requirements for a project, or they will be determined during the project (Agile), you increase the risk.
Additionally, when an application requires integration with a third-party application via an API or some other method (ETL for example), risk increases. This is because the development team doesn’t have complete control over the API or secondary application.
With an hourly or time and materials agreement, you assume this risk. If the project takes longer, the developer bills you for the time spent on additional features or troubleshooting API issues. With a fixed cost agreement, the developer assumes all the risk, if the project goes over the estimated cost, they will have to absorb the cost. For this reason, development organizations will often build this risk into their estimated cost when proposing a fixed cost project. For a fixed cost agreement, the cost will most likely be higher than a pure time and materials agreement for the same scope.
If a project is well defined and easily boxed in, then it is a good candidate for a fixed cost agreement (and Waterfall). The advantage of a fixed cost agreement is that you are guaranteed to stay within budget. The downside to fixed cost is that you may end up paying a little more because the developer is assuming the risk. Fixed cost projects are ridged in their structure. They lend themselves to a waterfall style development process as opposed to a more flexible Agile approach. You also must understand that because a fixed cost project is reliant upon the scope of work, any changes to the scope (additional features or changes in functionality) will need to be addressed via the dreaded CHANGE ORDER.
Conversely, hourly or time and materials agreements are more flexible, but you must be a little more flexible with your budget as well. With time and materials, you have the option to use a more agile development methodology and which provides more freedom to make changes to the application (add features you might not have considered or change functionality) during the development process. The scope of work does not bind you as tightly. Because of this, it is often difficult to constrain the budget. It is easy to get carried away adding cool features.
It is possible with self-control to complete a project at a reduced cost compared to a fixed cost project. The idea is to stick to a minimum viable product and not gold plate your application. You will only be billed for the work performed as you are assuming the risk (versus a fixed-cost project, where the project cost reflects the risk).
You can do a fixed cost agreement for an agile project, but the likelihood of hitting your budget is slim. During this type of engagement, you can expect that their will be several change orders along the way which will increase the cost of the project. Additionally, these types of projects can foster a very contentious relationship between the development team and the stakeholders. Each change will require a change order. Because of this, the stakeholders may feel like they are getting “nickel and dimed” for every little change. Fixed cost just does not play well with Agile.
In the end, both development methodologies can work well, and each type of development agreement has its advantages. It really depends on your project and your priorities which will be best for you.
A fixed-cost waterfall project works well with smaller, easily box-in projects. However, a time and materials agreement may save you money if you are willing to take some risk.
For larger projects, a time and materials agreement for an Agile project may be the best way to go. Especially if the requirements are not fully formed or are difficult to constrain.
These are just a couple of examples on each end of the spectrum. Chances are your project may fall somewhere within this range. In the end, it all comes down to what is most important for you and how much risk you are willing to assume.
Let us dispel a couple of misconceptions related to software development that seem to be fairly common. These concepts are:
The key to a successful project is finding your software development match. Starting a relationship with a software development company
It’s funny to think of it this way but having a relationship with a software development company can be like