Low-code is something you can fail to grasp, some kind of artifact.
5/14/2021 We break down the most common misconceptions about the low-code approach in development.
Which misconceptions about low-code prevent a fair assessment of the approach, where it helps, and when classic development is the better choice.
5/14/2021 We break down the most common misconceptions about the low-code approach in development.
Is low-code not a philosophy? Low-code is often confused with mature code-first platforms
Low-code is something you can fail to grasp, some kind of artifact.
Reading time: 12 min. In the previous article about low-code in enterprise solutions, we addressed business readers.
However, on Habr, most users are engineers, Captain Obvious, and in the comments on the article I saw a fair number of typical objections to LCDPs, low-code development platforms. And while those who do not know about the effect
Dunning-Kruger effect aside, since some are already looking for the dislike button, let's break down the most common misconceptions and ideas.
Some think low-code is simply the use of off-the-shelf products, not a development philosophy.
One colleague even used WordPress as an example. In low-code, there is no proper DevOps, meaning code review, versioning, deploy, etc., no proper code reuse, and no other abstractions.
And in general, low-code is for some standard solutions, which no-code is meant for.
Developers are better off writing code with ready-made value than building constructors. "You do not need to understand low-code; it is some kind of artifact. We will keep coding as usual."
However, some developers still do not fully understand DevOps and think it is a job title.
So the situation with low-code is not unique.
Why did we decide to raise the topic of low-code and the future of the IT industry?
In the mid-1990s I owned an ISP, and after that I held roles ranging from engineer at Beeline to managing partner at a company specializing in automation software development, which is my current role and one I have held for 7 years. And now it is interesting to think about what tomorrow will bring."
Starting with machine instructions, moving into procedural programming and giving up memory management, with the rise in the number of frameworks and the development of high-level languages, what comes next?
Will the level of development abstraction keep rising, and if so, how?
At the same time, demand for new products and automation is growing.
The shortage of specialists in the industry is easy to see in salary growth: it is outpacing productivity growth in IT.
In addition, the longer one development team stays on a project, the deeper it gets into operational support: more features generate more required fixes.
Development costs increase, and at the same time a conflict of interest appears: the business needs to change faster, while developers want interesting tasks.
But most business changes are uninteresting.
The IT industry has always responded to such challenges by raising the level of abstraction and simplifying development. The assembly era was replaced by the C++ era, then came the era of high-level languages with complete memory and resource management abstraction, and after that the number of frameworks and libraries only kept growing.
There are no signs that this trend will change.
Let's think about whether low-code can continue it.
In the CIS-speaking internet, every article about low-code ends with comments about the shortcomings of a specific product or products. We will talk about products separately a little later, but first I suggest thinking about the low-code concept as a whole.
Developers deliver the final value to the customer.
Layout of elements, new fields in entities, calculation logic, and integration flows are all implemented in code. Yes, it may have some settings that sometimes make it possible to make changes without involving developers.
But most change requests are still handled by developers. And here developers may have two wishes.
How can we write only interesting code and hand off the boring operational tasks ("move a button") to someone else? Let people come to us for operational matters only in rare cases, the number of which should ideally keep decreasing.
If we are asked for operational changes, let it be done more specifically.
And it would be good if understanding your own code, which may not have been touched for six months, were easier. It is hard to achieve that in code-first.
Imagine that you deliver to the client not the final value directly, but a building kit for realizing that value. No, of course, you'll have to implement the initial functionality in your kit yourself for debugging purposes.
But at the same time you'll be able to create calls, functions, and components that...
In the vast majority of cases, they are self-documenting. Every component has settings that make it reusable.
Here it's important to note that code-first platforms also have many settings, and they are even distributed across components.
In practice, however, their use does not allow most of the operational work to be taken off the developer.
From this and other components, you can assemble fundamentally new value for the business.
Technically these are the same interfaces, business-process components, and integrations, but for the business this is fundamentally different functionality.
If some highly specialized logic is required and one of the components is missing, and that logic clearly will not be reusable, you can insert the needed component by writing a small piece of code. Unlike code-first systems, you do not need to write an entire module or microservice here; you insert the code into the needed fragment without service scaffolding or sugar.
Such code is often easy to read not only for a developer but also for an experienced manager or business analyst, and it consists of 2 to 20 lines.
When you face a new requirement, you either assemble new functionality in the kit you've already built, or you add activities and components to it if they're missing.
If you look at low-code development through the eyes of a code-first developer, what changes first of all is the level of component abstraction.
Beyond familiar services, libraries, and builders, there is another, higher level of abstraction: business logic abstraction.
This holds true both when using ready-made LCDPs and when developing within the low-code paradigm.
In discussions, I keep seeing low-code used to mean simply very flexible systems. For example, Bitrix, because it has business processes and table modeling, or WordPress. An LCDP is a platform where everything is built on top of a visual builder, because if that is not the case, maintaining such a platform will eventually shift to code-first. I would define the following LCDP criteria.
The system core contains only the builder elements and everything related to them, so you will not need to use a code-first approach to implement what the LCDP is designed for. In the visual editor, you can insert code wherever it is needed. And in some platforms, you can even slightly override the code of the current component. Here are our favorite examples: ETL / ESB Talend and WSO2 are low-code mechanisms for building integrations.
Mendix, Pega, Appian, OutSystems, and Caspio as platforms for building applications of different classes. Reify, Builder.io, and Bildr for frontend work. Among the 2021 newcomers are Corteza (fully open-source, Go + Vue.js) and Amazon Honeycode. For gamers, when was the last time you looked at Unity and products built on it? Have you seen Construct? CIS platforms include ELMA BPM, Creatio (developed by Terrasoft), and Comindware, as well as the versatile CUBA Platform and Jmix.
Products from major vendors include Microsoft Power Apps, Oracle APEX, Salesforce Platform, IBM BAS, and SAP BTP. Partially open source options include Builder.io for the front end, Bonita, and Joget. There are also borderline cases. For example, Pimcore, which in front-end, workflow, and infomodel modeling with calculated fields is essentially low-code, with some caveats that are outside the scope of this article. If you try to do anything beyond that, you will fall back into traditional monolith maintenance. The same applies to Bitrix.
It is convenient for modeling data and building business processes, into which PHP code can be wrapped in a low-code style if needed, meaning without long initialization blocks. However, the huge amount of out-of-the-box functionality built outside the LCDP style, and the lack of mature low-code tools in other parts, lead to traditional code-first.
In short, if you hear, "we tried a low-code platform and nothing worked for us"
Maybe it was not an LCDP; maybe it was a truly bad LCDP, and there are plenty of those; maybe the team tried to write more code in the LCDP than necessary. Instead of reusability, there was a single custom component into which a huge block of code was pasted. We have seen that!
You will find these components in the vast majority of platforms.
Many (Mendix, Pega) have their own CI with low-code elements. Although, of course, review is not always easy.
If component code is clear, it works the same way as in traditional code-first. But as for what you can do in a builder... Imagine you built a Unity shooter, changed the walls, added mountains, then saved it and sent the whole thing for review. Obviously, you would not version every wall change, and you would end up with huge change sets that would be quite difficult to understand.
All the more so when it comes to visual changes and code inserts.
The review process becomes more difficult as the number of changes in a single commit increases. Reusability is also usually fine: processes can be used as subprocesses, and one "job" can call others, and so on.
If there is a desire to do it well, reusability will not be a problem.
Developers usually look down on the idea that they could build something by clicking with a mouse.
Meanwhile, the overwhelming majority of a developer's tasks are not rocket science but routine work.
The very kind you are not interested in and want to get rid of as quickly as possible. Within a project, your choice of tasks is limited. It is unlikely that only interesting and creative work will come your way (which implies that someone else will handle the boring tasks, and then everything said above applies to that poor person as well).
It is almost impossible to avoid small, and sometimes repetitive, boring issues altogether.
Simply because someone has to handle them.
How will the situation change within an LCDP?
Boring tasks will not go away and will keep appearing just as often, but instead of spending countless hours on them, you will be able to finish them many times faster or even hand them off to someone who is not a developer.
Why write yet another integration between systems when you can build it faster with ETL solutions?
Why fill a sprint with building a new screen if a designer can click it together?
The faster you complete boring tasks, the more time you free up for more interesting ones.
Moreover, statistically, you will get interesting tasks more often, because the break for routine work will shrink many times over. And what about truly talented developers, the ones who can solve any of the hardest problems elegantly and quickly?
After delivering a task as code and then receiving a change request six months later, they run into the following: they have to remember how everything was written here; it should probably be refactored, because code becomes outdated quickly.
And few business users will understand why a minor change was estimated at several days.
We wanted to write interesting code, but after some time we are not writing anything interesting.
What remains for us is operations and a guilty conscience for the fact that things here are already not very pretty.
If you think in terms of an LCDP, it is not limited to just faster handling of routine tasks.
Refactoring happens not at the level of final business value, but at a higher level of abstraction, at the level of the builder component implementation.
As a result, you have to think more and design more.
Fewer areas remain outside your oversight, and creating a poorly maintainable task in an LCDP is much harder because even non-developers can spot at least bad naming or flawed logic.
The approach itself makes you think more in abstractions.
Many team leads solve this problem for themselves like this: other team members handle implementation, while they do the thinking.
This leads to nothing good.
Such team leads often start missing code, and the team as a whole becomes more fragile.
The antifragility of such people is ensured by the fragility of other team members, who act as typists.
Both traditional and low-code developers can be susceptible to this flaw.
You can ignore the future of development if you assume that: the number of tasks for developers will grow no slower than the number of developers and development substitutes themselves (accounting for rising labor productivity); the business can afford development's growing appetites without going bankrupt (i.e., ROI in IT will always be positive); and other types of investment won't compete with investment in IT. Let's run a thought experiment and estimate how likely all of this is in real life.
I cannot predict the future, but I can imagine what conditions are needed for this shortage to persist forever. First, developer productivity must not increase enough to compensate for the shortage gap, meaning by 10% relative to current productivity. Second, the number of developers must not grow faster than the number of tasks.
An additional condition is that the number of development substitutes must not reduce this shortage. That contradicts the fundamental law of supply and demand, because demand is always balanced by supply to an equilibrium point.
A huge number of people are either thinking about retraining into IT or are already in the process of retraining.
According to surveys, one in five developers has no specialized education and entered IT after completing courses. And that's not counting the pervasive programming courses starting as early as kindergarten and school, and the ever-growing stream of IT-major students at universities. IT is starting to take potential specialists away from other professions.
In investment bank reports, the market for no-code solutions, which are direct substitutes for development, already looks roughly like this.
And if you look at this list, you will see that the number of products is growing. Search for "the name of any low-code/no-code company"
- and you will see that almost everyone, from CIS's Sber to America's Apple, is thinking about how to significantly increase development productivity. After all, labor market imbalance is easy to see in the ratio between the cost of managers, who carry greater responsibility and on whom multipliers depend, and mid-level engineers, who carry much less responsibility.
The income gap is 3 to 4 times, and that is no accident.
With 20 million developers in the world, just
India supplies the market with a million developers a year (and that number grows each year), meaning there is some probability that the developer shortage may not persist in the future.
There are also more radical opinions: from
German Gref, for example, or a futurologist
The more expensive development becomes, the wider the gap between tech companies and everyone else. Everyone else is forced to plug into the ecosystems of the giants. And those ecosystems have very high productivity (because of their scale).
This alone pushes companies into someone else's ecosystem.
There was a time when IT costs were negligible.
But software is becoming ever more complex and varied, and the cost of IT infrastructure is a significant factor for startups and one of their main budget line items.
The more expensive IT becomes, the more substitutes there are for investment.
Organizations see digitalization as a well-paying investment.
The wave of digitalization will pass (all companies will be digitalized to some degree, and the rest will leave the market), and the deployed solutions will need to be maintained and supported.
With the ever-rising cost of IT, won't the question of finding other sources of income arise?
Will IT costs at some point become so significant that they automatically filter out most new projects that are profitable today?
I recommend that developers take a look at low-code and, at minimum, complete a few tasks on one of these platforms to broaden their own boundaries. We need to understand where it applies, see a snapshot of current capabilities, and learn something new, because we are engineers and should look at new technologies through a practitioner’s lens. You may not find a single LCDP that solves your tasks, but at least exploring this trend to grow your engineering awareness can be useful today.