Software is difficult to master, but at the same time is its mastery the key to competitive advantage in the digital world. Success depends basically from putting in place the following elements:
- Know why you need to create your own software, and it should be about profit.
- Make sure your requirements engineering capability is top notch.
- Establish and nurture multi-skilled DevOps teams that contain domain knowledge.
- Choose good programming languages, automated development environments and engineering practice.
- Make sure its part of the firms technology branch.
For those who want to learn more, a more thorough story is told below:
The first thing to put in place is the rationale for doing it. The only valid reason is profit. I have chosen to talk in terms of profitability, as I see cost reduction as a mean to create profit. There are basically three ways software can create profit:
- Create a product and license it to users for a fee.
- Create an online subscription service.
- Create an internal product or service that automates and optimises internal processes.
In addition there is a forth alternative; make internal services available for external customers for a fee. All these three options can use open source development and licensing models for cost reduction and sharing. How that can work will be addressed in a separate post.
So, knowing why you want to be good with software, lets take a look at what you will need to put in place.
Firstly, since software is systematised knowledge, and knowledge is perishable by nature your software will need to be continuously updated. This make your software outfit a centre of change and it needs to be designed in such way.
Secondly, to quote Steve Jobs: «the most important software you have, is the one you decided not to write». This mean that product management is crucial to succeed and it means that the product owners, to use a SCRUM term, most important word is NO. Being able to prioritise features in such way that released products or services continuously adds business value is crucial for the profitability of your investments. In terms of software engineering this mean that a good requirements process need to be in place.
Good requirements is the key to reduce rework. Therefore is it not enough to provide the right requirements, but the requirements need also to be right. If it cost $1 to fix a requirement the same defect will cost $20 during design build and most likely $200 or more in production. Good requirements engineering practice is the key to product profitability and product quality.
Thirdly, with a backlog of good quality requirements we need a skilled team of developers with good software engineering practices at their backbone. The best way to organise the product team(s) are as DevOps, where the same people is responsible for new features and operational stability / product quality. The team should consist of both subject matter specialists and software engineers, usability expertise and testing capabilities.
On the technical side I have a preference for strongly typed programming languages combined with Domain Driven Design, ensuring that the domain concepts at hand find its way into the source code, and that the source code is readable in terms of domain concepts. A banking systems operates with concepts such as accounts, interests rates, deposits and withdrawal.
To enhance product integrity develop libraries that are shared between various modules. Such libraries consist of functions and immutable value objects.
Fourthly, put in place an automated production lines for both development and operation. Instrument the running code with logging and use tools such as Splunk to analyse these logs in real time. It´s the only way to capture and understand the products operational behaviour.
Finally, how to organise? Dependent of size, but my recommendation is to make this entity part of the firms technological muscle and place it at the appropriate organisational level. The more important it is for the firms competitiveness the closer it should be to the CEO.