Through the years of work with different types of clients, we truly appreciate that experience when we implement the product from the scratch, having just a client's idea, and till the production, seeing how this client rises investments and reaches paid clients.
However, it is absolutely clear that all ideas are like gasoline, which still needs oxygen and spark. That's why it is so important to try and not give up. This motivation article is about one of our projects, its failures, our learnings, and final success.
Successful start and significant failure
Each particular client who joins Jappware is our friend. This time was not different, the kickoff stage went well, requirements were clarified, solutions and roadmap were offered. All was ideal except a very typical point - pretty old technology for the front-end. Yes, the client already had a PoC version and, of course, he preferred to continue work from that point. Today we would stop it, do our best to show different edge cases and pitfalls, etc. and prevent usage of old or deprecated things, but that time we agreed to use what was offered. Do you think that's all? Nope...
4 months - this is an exact time that was spent to discover many other issues in the existing solution that was used as a common and fundamental approach. The not flexible and not extendable architecture of the back-end brought more and more pain for changes each time we were requested to add new functionalities. Old technologies were not compatible with requirements and we added more and more workarounds instead of producing valuable changes and significantly improve and grow the system. 4 months! before our CEO found the right arguments and explains to the client why it is a waste of money to continue doing such things. It was a disaster, everyone understands it, but for the client, it was much more painful.
In a couple of days, we did the research without any additional cost to understand how we can help our client, which learnings we did working with the old system and what actually our client looking for. The proposed solution was so cool, honestly, it was cool enough to grow a seed in our client's head and make a decision - start from scratch.
All failures bring us experience, their value is even equal to success. One of our clients told us once "In case you failed, again, just increase the version and go ahead" - this is so true.
4 months of work brought us an excellent understanding of the product business value, client expectation, setup great development, and communication process, we left forming and storming phases and proceed with norming and performing soon.
The new architecture was designed from scratch, using the latest technology stack and including best practices to make it extendable and flexible for modification, new requirement implementation, and even own DSL to specify complex business logic through the property files to be able to change behavior without development and redeployment.
3 months - this is the time which was spent to bring the application on the same level it was before we start redesigning everything. But this time we had strong architecture and team, including cloud infrastructure and documentation (which, actually, was not present previously). The client was happy, but not enough, because, the task backlog was almost the same it was when the client joined Jappware, it was a challenge for all of us.
Hard but systematic work and process
Having a huge backlog and a limited amount of time we start thinking about how to implement our own development process using only best practices to make deliverables more predictable and provide a proper quality.
Thankfully to our team "Andrews team" an approach was in defined very quickly. The main goal was to satisfy the client's expectations and release the product in time, but, keeping in mind that we already spent a lot of time reworking the solution. Here are the main points that help to make the release date happen in time and without pitfalls:
Daily standups including client participation (treating the client as a team player)
2 weeks sprints with a clear roadmap (including planning sessions)
Intelligent CI/CD (to integrate between the whole team faster and deliver snapshots for testing)
Automated API documentation generation through the test execution to simplify integration between Front-End and Back-End
As a result, we got a highly predictable delivery process and a transparent approach for the client. The main goal was reached and the client received production-ready products including documentation and continuous delivery infrastructure. "Andrews team" was already on a "Performing" stage and brought synergy into their software development process, everyone worked like a single and completed mechanism, without any additional management.
Release and fail, again
It was done. We released our product into the external world and received the first users. The fly was OK and no one expected any issues. But, they, of course, happened.
After a month of being alive we collected a lot of metrics and logs, we continuously did a detailed health monitoring and noticed that one part of our system consumes too many resources which quickly release after some period of time. This was pretty unpredictable and we started adding more and more logs and metrics to understand the nature of this issue.
It was a sunny day, the team just came to the office. And realized a lot of errors in the logs. This was another disaster since that time when we realized that our architecture can't handle all requirements. The issue was fixed immediately and using our continuous deployment approach we deployed improvements without any downtime and during the seconds. However, we already received a couple of complaints and support requests from our users. Learnings:
Add more metrics in those places where you implement resource-consuming functionality (work with the database, file system, 3rd parties, etc.)
Add more alerts triggers even you think that such error can't happen or bring issues
And the most important: Please, keep your eyes on performance, especially if you know that this platform will be used by multiple users at the same time and they might trigger some "hard" task execution
Our issue was with export functionality. Each time when users trigger data exporting we run an asynchronous task to build the report from the pre-computed and aggregated data. But we were not ready that this might happen for more than 500 users approximately at the same time. And this is our fault which brought us new experience in issue solving and resource management. To be absolutely clear we failed about 43 reports creation, which is less than 10% on the whole load. Our further decision was based not only on efficient resource management but, also, on auto-scaling groups for each part of our system.
Paid clients and investments
After 6 months of the robust work of our application, more than 2000 users of the platform, and continuous attempts of our client to promote the system, we were invited to a competition for a European grant. This was a great opportunity to receive investments and increase our development team to build more useful features. We and our client started work on an offer for a commission for considerations. The main points were:
Introduction on AI-based functionality to help users work inside the system
Forecast based on a 3rd party aggregated data
Profiles, Multitenancy including Branding
The biggest focus we did on the AI part and how we can use ML algorithms to help our users make more value and take more from the system.
We don't know how exactly the European grant commission making their decision, but we were not able to get their approval due to lack of 3 point. We got 88 points but the grant might be given to those who get MORE than 90. Sad but true. Our client had a discussion to get more explanation but, all that we know is a lack of paid clients.
It was, actually, the second huge challenge, and again for all of us including our client. We spent months improving the system and promoting it, participated in different conferences, and presented our solution organizing different trainings and recorded lessons. After some period of time, doing the hard job, we were able to bring our first paid clients and you know what? Yes, our client reached his first investments and now we all together continue to build great and smart features for our users.
Long story short.
Never, never give up even you realized that spent a lot of time in the wrong direction
Take care of your team, build it properly and continuously support
Learn from each step, learn and build conclusions
It never can fail, it just might be not enough for success
Failed once - call it version 0.1 and proceed with a new version
For Jappware it was an amazing experience. We built the project from scratch and saw its first investments. Right now it is a partnership between us and our client, we trust each other and always ready for new challenges.
Never give up and follow your dreams!