Design, Build and Modernize applications
Modern applications can get you and your customers to the next level
Software development is complex
Over the past few years, we saw a change in software development whose scope and responsibilities has been steadily expanding. If we only consider technical aspects: it must run in the cloud, be properly secured, ubiquitous (Web, mobile, integrated into other applications...), highly resilient, support always more users and process always more data. Cloud technologies surely help in the deployment and operation of applications but they might be complex to implement and always put constraints on applications and ultimately software developers.
Contrary to what one might think, application development has become more and more complex simply because there are more and more aspects to consider. In the end a software developer must be familiar with more and more technologies in order to make always more decisions during design, implementation or even operation phase which take him away from his primary objective: delivering value.
DevOps transformation aims to shorten the System Development Life Cycle and therefore the time to market while improving the stability of applications thanks to the automation and monitoring of the process from the development to the operation of an application. However, although these practices will eventually improve software development process, they also bring more responsibilities and imply many new things to learn and digest. The setup of a complete DevOps environment might also be as complex to put in place as cloud technologies and in any case it won't prevent a poorly designed application, therefore difficult to test and maintain, to be deployed faster without failures.
These facts reveal the importance of a good application design with smart technological choices and an efficient development process which will condition the long term success of your projects.
What is a modern application?
A modern application shall respond to previous concerns by being specifically designed to be:
- developed using DevOps practices in order to shorten the System Development Life Cycle,
- optimized to run in the cloud in order to make full use of resources,
- adaptable and customizable in order to operate in multiple technical and functional contexts,
- flexible and maintainable in order to deliver value faster with minimum failures and quickly recover when this happens,
- reliable, secured and of high quality over the long term beyond static code analysis, tests and the obvious fact that it is working at a given point in time.
Such applications have longer life spans as they should be able to adapt to numerous technological and functional changes with limited cost.
Using the right technologies
As stated before, the amount of technologies (platforms, tools, frameworks...) at our disposal to develop applications is just overwhelming. For instance, a Java DevOps developer might use the following technologies on a daily basis to develop, build, deploy, operate and monitor an application: Git, Maven/Gradle, multiple frameworks and libraries, Jenkins, Nexus/Artifactory, SonarQube, Fortify, ElasticSearch, LogStash, Kibana, Docker, Kubernetes, Prometheus, DynaTrace, Grafana... Most of the time, he will simply use these tools but they still require to be setup and deployed as part of the DevOps environment and it would also be bold to say that it is not important to understand how they actually work and what they do as it would then be easy to miss something important during design and development phases. It is important to make educated technological choices based on precise requirements in order to limit negative side effects.
When considering modern applications, it is also important to choose a software development platform that allow to structure an application properly in order to create applications that are modular, flexible, easy to develop and maintain by a small to large group of people. There are plenty of discussions over the Internet to determine which is the best programming language out there. Most of the time, people focus on a single aspect of the problematic, such as how easy (ie. how many lines of code...) it is to develop a particular feature in one language by comparison to another. First of all, it is more accurate to consider software development platforms rather than programming languages because the platform is really what makes the difference. Then rather than trying to compare apples to oranges (they are both fruits you can eat but they taste different), let's start by listing the main characteristics expected from a software development platform in order to develop modern applications:
- the platform must support modularity which is the key to maintainability, durability and stability.
- the platform must enforce strictness and explicitness, although there are many ways to express or implement an idea it must be done in the clearest way possible which is eventually the fastest one.
- the platform must be mature and resilient to change in order to create durable applications also resilient to change.
- the platform must produce fast and efficient applications that optimize the use of resources in the cloud.
Now every technology has strength and weakness, what matters is for the strengths to be in line with previous points and for the weaknesses to be well-known and accepted. We created the Inverno Framework for modern application development on top of the Java™ platform as it offers everything that was just mentioned: modularity is at the core of the platform, the Java language is strict, secure and explicit, the platform is mature, it has been there for years and has proven to be resilient to change and the Java runtime is one of the fastest out there.
Other platforms might also match above criteria, the choice really depends on multiple factors, including the people that will actually work on your projects who must be familiar and trained to properly use the chosen platform.
We offer you support and guidance in your technological choices in order to pick the right technologies for your projects.
Industrial Software development process
Considering that it is possible to produce a software while thinking about what it does is pure fantasy and will eventually result in a poorly designed application with all that implies. You must know precisely where you're heading before you can start anything, how you get there is subject to change but the overall objective should remain unchanged within acceptable limits. It is therefore crucial to properly delimit a project and take the time it takes to setup an environment and an architecture that puts you in the best conditions to complete it.
We propose a unique industrial Software development process mixing both traditional and agile methodologies. In a nutshell:
- Iterative specification process leading to the creation of a software requirements specification that precisely delimits the scope of your project
- Definition of an environment and a software architecture meeting the specification
- Definition of the phases of the project and high level planning
- Iterative software production line
- Final project delivery
- Iterative software evolution line
During all this process, the common thread should be to prepare a lot and act little.