If you have been working longer with Outsystems, you may know that it's versioning system is quite simple. In my opinion, it sucks. Outsystems lacks support for branches, the ability to run multiple versions concurrently, or a local development server. That may be okay, let's dive into it's strengths and weaknesses.
Why branching is nice
Branches allow you to work on features while keeping the Main branch clean and ready to deploy. If you're an Outsystems developer in a professional environment, you will probably collaborate with other developers. Usually you will be working on developing a single feature or user story per developer. Since Outsystems has a single "branch", you are basically blocked for deployment if you're colleagues are still working on user stories.
How does the versioning work?
Outsystems uses a trunk mechanism based development system. Environments are leveraged to run other versions. Those versions should be increasingly stable, ranking from development (least stable) to production (most stable). When you publish a module in Development, Outsystems proprietary mechanism stores a version of that module. When someone else publishes a newer version in the meantime, your version is automatically merged when published. At least, when there's no merge conflict. In that case you will have to choose pick and choose which version of the conflict to keep. In order to deploy your application, you will have to "tag" your application with a version in Lifetime. That version can then be deployed to one of your environments.
The platform does offer the option to publish your changes in a Personal area. That allows you to test and debug your changes without affecting other modules on the server. This feature however, is only supported in certain cases, for example when you haven't changed any entities, timers or site properties. So it's not a real alternative to branching I would say.
A few years back, in 2020, Outsystems main competitor Mendix added support for Git as version control system. Actually I'm a bit jealous and hope Outsystems will catch up.
Why does Outsystems not support branches?
Actually, I can only guess. There may be a few reasons. The first one is rather simple. Each environment runs a single version of an application. Even if you have multiple frontend servers, there's no way to spin up multiple versions of your application. Since Outsystems works on a Windows server with IIS, ASP.NET's web server, it's tied to the server. You cannot start a local server on your laptop in that regard. The second one is simplicity. Outsystems aims to simplify development, which in this case means less features. I agree that GIT can sometimes be complex, but at least having some more options would be nice.
Dealing with complex merges
Neat thing is that after tagging a certain version, it can be deployed, even if you continue developing. So before starting to work on a new feature, it may be wise to tag the stable version. Consult with your colleagues to find the proper moment to tag an application. Also, consider your process and when you want to deploy versions. For example, if you use SCRUM, aim to make a releasable version each sprint.
Another option that may be useful is feature toggles or site properties to switch between versions of logic. This will help you to release a version, while still working on unfinished logic. You just disable that logic. This is something you should actually consider, it's good to release versions of your application often. That way you can avoid big bang releases. However, when the number of toggles grow, it can get messy. This option requires your discipline to actually clean up obsolete toggles. Besides that, it mainly applies to logic or interface elements. There is no easy way to toggle entity changes.
Some hope remains for ODC. Since ODC runs on Kubernetes, the technical limitation of frontend servers would be lifted. At least for the logic part it should be possible to run a new container with a different application version. Let's hope Outsystems will listen and allow for a more flexible versioning system!