Our take on how to develop and deliver excellent software—and not just software—and why you should strive for excellence.
Software and the need for it is omnipresent. In Business, for almost every information management challenge, there is either a software solution or the need for one. If there is no existing software solution for a particular challenge, nowadays it is relatively easy to build custom software targeting a particular challenge—thanks to powerful frameworks, UI component libraries, and cloud computing. Thus, there are many options and alternatives for either choosing an existing software solution or a technology, or for designing and developing one. You are spoiled for choice, independent of whether you want to purchase an existing solution or whether you want to develop and provide for your or somebody else's challenge.
Whenever there are options and alternatives for addressing a challenge, it is only natural that people feel the urge to choose the “best” one—for example the most economic one, the most performant, or the one with the best usability. Thus, as a software developer or provider you want to make sure the software you build is the “best”—it should be excellent. So, you probably care about questions like: How can you provide your users the “best” software solution which addresses their needs and challenges? How can you make sure the users love your solution? And how can you make sure your solution maintains its competitive advantage over the other alternatives out there?
When your software solution is excellent, people will keep using it, keep buying it and do not start to look for alternatives. Its excellence guarantees competitive advantage. Only excellent software can be provided and operated in the most cost efficient way. Excellent software is key for increasing operational efficiency and thus high profitability. And, only excellent software can deliver on the promise of offering the best value for money.
In this blog post we share six guiding principles we believe allow you to develop and provide excellent software.
Let’s state the obvious first: Agile development is key for excellence in software engineering. Various studies show that an agile development approach increases the success rate of a development and decreases the risk of failure. For example, the Standish Group Chaos Study from 2020 based on more than 50K project cases claims that the chances of success of an agile project are three times higher than of a waterfall project. And, a waterfall project is two times more likely to fail, compared to an agile project.
Worth mentioning is that mastering Agile is not just about applying methods such as Scrum or Kanban. We believe that mastering Agile means understanding the underlying principles, values and mindsets as nicely illustrated by the Agile Maturity Iceberg by Matías E. Fernández. Teams must understand the “why” behind Agile and fully embody its values and principles. In essence, Agile is a way of reducing the risk in projects by delivering value early.
Only a deep understanding of your target users’ needs allows you to build excellent software that matters. In a business environment, a software or IoT application should support a user in performing his job or even better replace tedious and repetitive jobs nobody wants to do anyway. As a software solution usually collects, manages and provides information, a good starting point is usually to ask: What information would help a user to make better decisions or could trigger or enable subsequent actions? After identifying the information valuable for a potential user, you can start thinking about the implementation and the technology for providing that information in the most easily accessible way at the right time and place.
Implement technology always for a human being, never just for the sake of it. In practice, you should always formulate your requirements as user or job stories. It helps you to make sure that you really understand why something should be implemented from a user’s perspective. Be aware that a user could also be the engineer who has to maintain the code and not always only the end-user of the application. For example:
As a software engineer I want to refactor this code, because it reduces my maintenance effort.
Excellent software is as little software as possible. The general design principle “good design is as little design as possible” introduced by the German designer Dieter Rams in the 1970s can be transferred to software development without further ado and still holds its importance. By focusing on the features that are really needed you can kill two birds with one stone. First, you increase the usability. A clean and simple user interface outperforms a cluttered one with information overload by far. Second, you keep the maintenance efforts low by avoiding code which does not provide much value. In the spirit of Rams: Excellent software is pure and simple!
To put this principle into practice the 3-why rule can help to detect unnecessary feature requests. Whenever someone requests a new feature or a change, you or your product owner (PO) should ask three times why. The 3-why rule helps to find out what is needed and if it is really necessary. For example:
Requester: I would like to have an input field for the house number in an address form.
Requester: So that the user can enter his house number.
Requester: So that we have the house number separate from the street name.
Requester: So that we can sort orders by house number and pack the parcels in the correct order to the delivery vehicle.
PO: Ah, ok. So, we don’t need a form field for the house number but a solution to load the parcels in the optimal order to the vehicle, don’t we?
Requester: Yes, exactly!
A good choice of tools and technologies positively impacts your operational excellence. Your choice of tools and technology has a huge impact on the efforts for developing, maintaining, and operating your application. When you choose new tools and technologies you might need to invest some learning efforts. But learning something new pays off, if it increases your coding, maintenance and operation efficiency down the road.
When selecting your tools and technologies make sure to select the one which is just good enough for the job and avoid over-engineering. Too many different tools can also increase the complexity and therefore decrease the efficiency. Also, regularly question your current setup and reflect on your choices, because especially digital technologies evolve fast. This does not mean that you have to jump on every new technology trend. Carefully weigh the pros and cons of technology alternatives before deciding to switch.
By incorporating the principles of DevOps you make sure not only to build a great software product but also to achieve excellence over the entire application life cycle—plan, code, build, test, release, deploy, operate, and monitor. The main goal of the DevOps Philosophy ist to increase speed, improve stability and reliability, and responsiveness to varying surrounding conditions. By uniting development and operations under the same roof—in the same team—you enable continuous flow, direct feedback and ongoing learning along the entire value chain of providing a software solution.
To achieve excellence in DevOps you need to continuously improve your value chain processes. Be aware that DevOps is not just the implementation of CI/CD automation and hyperscaling cloud deployments. If you want to improve your DevOps processes you can start with simple things like requirement management or release planning.
Excellent software is not a constant. Software must be able to evolve and adapt. For example, it has to adapt to changing user needs, to changing technology standards, or to a changing composition of the engineering team. At all times, you need to be able to effortlessly add or remove functionality without compromising the performance of your software product. A software engineer who has never worked on your software should still be able to understand and extend the code.
Achieving maintainability means keeping your code clean and well structured. A modular architecture made of components with precisely defined and documented interfaces enables interchangeability of components. This allows obsolete or no longer needed components to be replaced or removed. If you want to develop a new software product, plan and budget not only for the initial release, but also consider how you will operate, maintain, and evolve the product.
Incorporating our six guiding principles for providing excellent software allows you to increase the quality of your software solution and to increase the efficiency and effectiveness for development, maintenance and operation towards excellence. Striving for excellence is desirable because it creates and maintains competitive advantage by reducing cost (operational excellence) and product differentiation (product and service excellence). Do not offer just a software solution. Provide the most excellent of its kind—the one your users and clients love and keep loving!