Code 2 Impact Development Methodology
In our experience of building software, clients always present an initial set of requirements which they believe will make an impact to their business. A project is considered to be executed successfully if the requirements are captured in exact detail and solution developed with high quality to cater to all requirements in the specified timeline. However, often we have observed that despite successfully executing a project rapidly and to client’s satisfaction, the software is abandoned within a year of going live. The reason cited, the software does not have the desired ROI and hence do not justify the cost of maintenance and running.
On doing deeper analysis two key facts emerge which are gaping holes with regards to impact creation. Firstly, the requirements are often bloated and tend to look at business activities in a functional manner without focusing on the principles of generating business value. Many times, certain key activities - central to value generation and requiring problem solving through software - are either sidestepped or not given adequate attention. Secondly, once the system goes live the usage feedbacks are seldom used to evaluate if right impact is getting created and identifying the gaps in the impact creation process.
The above analysis and realization put us on a quest of using software to create business impact. We figured out that while we are building useful software it does not add to collective knowledge building which is crucial to create impact through software. There is no continuous engagement between people on the business side and the software development side except through sharing of user interface screens and flow. This does not help developers to learn the important principles of business they are assisting and so they end up producing functionalities mechanically. Business folks, in turn, don’t refine their own understanding by distilling their knowledge to essentials and by understanding the conceptual rigor required of a software project. As a result, the project is never able to gain the kind of leverage where powerful new features unfold as corollaries to older features.
To address the above concern, we spend a lot of time refining our process, practices and tool sets to come up with our value creating code 2 impact development methodology (C2I Methodology). This document attempts to explain in detail the essence of C2I methodology and how it creates value for our client.
When we set out to write software, we never know enough. Knowledge on a project is fragmented, scattered among many people and documents, and mixed with other information so that we don’t even know which bits of knowledge we really need. Requirements are often crystallized using wireframing, user interface screen design and prototyping. This helps us in capturing the functionalities in detail and focusing on the usefulness of the software, while missing out on the driving principles of business domain. Often, this leads us to make false assumptions.
Business users are usually not aware of how complex their mental process are as, in the course of their work, they navigate all the rules, reconciling contradictions, and filling in gaps with common sense. Software can’t do this. It requires rich interaction between development and business team which leads to continuous learning and knowledge accumulation. Such interactions often need to go beyond basic requirements into business activities and rules where they may be actual inconsistencies. Only through such rigorous knowledge crunching process would we be able to enforce the right focus on high value creation activities and business impacting rules. The refined and evolved code 2 impact software development methodology of IOO Labs support such rich interactions between development and business team
This code 2 impact methodology focuses on generating value for our clients in the following way:
- Domain Driven Design – A very high business impacting process of unpacking the crux of software and bringing it to the fore by using a specification language which combines analysis, modeling and design into an unified activity.
- Rapid Application Development – Our highly evolved development process which leverages automation of code based on design, microservices architecture, automatic integration of user interface code and microservices and a top down user interface code development.
- Quality@Speed – Our strong emphasis on identifying right test cases which maximizes coverage and minimizes redundancy, and which can be continuously and automatically executed.
- Data Centricity – Another high business impact process where usage data and analytics from live system is continuously tracked and reviewed to identify gaps in impact and spotting futuristic trends.
- Infrastructure Management & Stabilization – Housekeeping of the software infrastructure that hosts the application; Continuously managing and stabilizing the infrastructure cost; and applying global practices and standards for application monitoring
Domain Driven Design
We adopt a domain driven design to software development. Domain Driven Design is a way of looking at a software from top down. When we are developing a software, our focus is not on technology. The critical complexity of many software projects is in understanding the business or domain – a sphere of knowledge or activity, we are trying to assist with the software.
We approach software development by developing a better insight into the domain. In order to understand the domain better we model it – create a system of abstractions representing selected aspects of the domain. The model distills knowledge and assumptions about a domain and serves some use specific to a particular set of scenarios.
We have developed a specification language, using which business users and software experts can have creative collaboration to jointly develop a domain model. Usually business users use their jargon whereas development team use their technical jargon for discussing the domain. The specification language then acts as the ubiquitous language between domain experts and software experts to help solve the misalignment between business problem and software solution.
This specification language uses the interactions and elements of the model to describe the various scenarios. The specification language enables to have the interaction only at level of domain, business process, business activities and business rules and not worry with unnecessary responsibilities of display logic, storage logic, application management logic and so forth.
This is a far superior alternative to discussing the requirements in terms wireframe, user interface screens and prototyping. It is because when we use UI to define requirements it leads to creation of different models - the user model and the implementation model. Often the implementation model is force changed to user model using some clever illusion. This often leads to confusion and chaos. But by using a ubiquitous specification language based on unified model what emerges is pure business knowledge which can be put to work with very high impact.
It is not adequate to develop a single unified model. It is also tightly bound with implementation and coding. Our development process is thus an iterative process of refining the model, design and code as a single activity.
Rapid Application Development
In our application development we adopt a Rapid application development (RAD) methodology that focuses on developing applications rapidly through frequent iterations and continuous feedback. Complications in software development are alleviated by focusing on customer satisfaction through early and continuous delivery of valuable, working software. While we emphasize on speed, we also welcome changing requirements, even late in development. We communicate with all stakeholders frequently and in real time to update on progress, solve problems, and improve efficiency.
In order to support the rapid application development process, we have developed a low code development platform. This platform integrates modelling with implementation. So, any change in modelling and design leads to change in code and vice versa. The platform leverages the design patterns of Microservices, CQRS and Event sourcing for application development.
The platform enforces automatic partition between user interface layer, application layer, infrastructure layer and domain layer leading to separation of concerns and cleaner design of each layer. The UI code is automatically and seamlessly integrated with the microservices. Thus, the UI coding can focus on the capture of user input and display of information and other display concerns instead of worrying on application processing and business logic.
The concerns of application layer and infrastructure layer are hidden which means developers while writing the program don’t have worry about accessing database, communicating over network, managing application tasks, and so forth. They can with an open mind focus only on the domain model which captures the essence of the business – entities, business objects, activities, business rules.
All the above help in quickly putting up the functionalities end to end, make code easily maintainable and modularizing of code. The net effect is application is built faster and also it is change absorbing.
With faster cycles of delivery, Testing is a key element to cope and anticipate challenges arising out of it. For us testing is not an afterthought but is at the heart of our development methodology. Our development platform has strong provisions for supporting behavior driven development (BDD).
BDD starts with a business goal and translates it to features and stories. Projects are decomposed into sets of capabilities – features in software that enable users to be more efficient. The behavior of system is described through use of examples, which are written in a readable and understandable language. Every single bit of deliverable functionality focuses on the intentions and patterns of users. Instead of trying to deliver as many features as possible, we focus on identifying how the features will support the user behavior or the business, using techniques of impact mapping.
Tests in the form of plain text features descriptions with scenarios are typically written before anything else and verified by the non-technical stakeholders. Such tests are automated for continuous testing and become the basis for driving development efforts.
In addition to that a lot of emphasis is given to functional testing and creation of high-quality test cases by linking to the domain model.
We use a combination of API testing, UI based automation testing and manual testing to ensure the robustness of the application. We adopt a test-driven project management approach – measure and update progress of our software development based on successful execution of test cases.
In our application development we leverage the event sourcing design pattern. Event sourcing involves modeling the state changes made by applications as an immutable sequence or “log” of events. Instead of modifying the state of the application in-place, event sourcing involves storing the event (which are immutable) that triggers the state change. In traditional application development “events” are often added as an after-thought, derived from the changing reference data. Event sourcing reverses the relationship between data and events. Events no longer are secondary but drive all of the business logic, and it’s the read models that are derived from the event stream.
Event sourcing enables us to create many redundant read models, duplicating data as needed (the event stream is always the primary source of truth anyway), aggregating and indexing data as required by a particular functionality. Moreover, existing read models can be recreated, and new read models can be created retrospectively, taking into account all the data that is available in the event stream. All of this is truly liberating from data analysis point of view.
Event sourcing also provides a complete log of every state change ever made to an object making troubleshooting easier. By expressing the user intent as an ordered log of immutable events, event sourcing gives the business an audit and compliance log which also has the added benefit of providing data provenance. It enables resilient applications; rolling back applications amounts to rewinding the event log and reprocessing data. It has better performance characteristics; writes and reads can be scaled independently. It enables a loosely coupled application architecture; one that makes it easier to move towards a microservices-based architecture.
Event sourcing enables building a forward-compatible application architecture — the ability to add more applications in the future that need to process the same event but create a different materialized view.
Infrastructure Management & Stabilization
The applications that we develop are generally deployed in cloud servers to optimize the capital spending of our client and also improves in overall efficiency of managing and deploying of application system. But hosting application in cloud presents its own set of security challenges. In order to handle security of data and services in cloud environment we adopt multiple strategies while deploying an enterprise application in cloud.
At the application level itself, we try to make the APIs secure by addressing issues like identity, authentication, authorizations, sessions, username, certificates, OAuth, API key etc. Also, access of the cloud network is restricted to authentic people through a stringent authentication process – multi-factor authentication like static password and dynamic one-time password through tokens. Sometime based on requirement IP addresses are restricted for cloud applications so that users in corporate network can only access the cloud service.
We apply a set of global standards and practices to production system management. All sensitive data such as PII information, passwords etc. are encrypted before transferring to the cloud environment. Regular and secure back up of data is taken to prevent loss of data. Network activities are continuously monitored to detect intruders and also evaluate network vulnerabilities. Through creation or alerts and performing real-time analysis of production data application and services are proactively monitored for 24/7 availability. The production metrics, logs are continuously captured, categorized and analyzed to evaluate how application and infrastructure performance can be optimized from cost point of view without impacting the end user experience. All these becomes critical as application and infrastructure update frequency increases.
Our development platform leverages design patterns such as CQRS and event sourcing which separates that read concerns (approximately 96%) and write concerns (4% but business critical) into different code bases and databases. This achieves vertical scaling of application since indexing requirement for searching and queries never delays the writes due to index rebuilding and table locking. The platform also provides supports horizontal scaling. This can be achieved using a combination of DB replications, clustering and load balancers. All this help in making the architecture fault tolerant and available 24x7. We are also continuously increasing our expertise in using serverless architecture. We have a team of experts who on need basis can provide consulting services on how to optimize the deployment architecture from a cost point of view.
To summarize, business impact through software cannot be created by merely implementing a list of functionalities. The process of building software is a voyage full of discoveries. Impact is created through a process of knowledge accumulation achieved by rich and continuous interaction between business and development team. This knowledge accumulation spans beyond software development and into data analysis from live systems.
Before embarking of software building journey, it is essential to clearly lay out how the software would impact business in value generation. From there one has to work back word to identify important business activities, key business rules and core requirements. All this requires a highly sophisticated, evolved and disciplined software development process and practices. IOO Labs code 2 impact development methodology assists you in achieving this and developing deep and impactful software solutions.