I read this article about United increasing their performance of the 787-9. More specifically increasing thrust and range, But it says this will be done over software. How do you make an engine burn less fuel and more thrust over just software.
This is not at all uncommon in car engines, and optimization can be done in jet engines also.
For longevity and safety reasons engines are not ran to their full capacity (except in drag race cars), there is always some margin, and in aircraft engines this margin is considerable.
As engine models "mature", more data is availlable about how they stand the test of time. With this data the algorithms running the engines can be optimized, possibly leading to performance gains.
There are a non-trivial number of actuators in a modern jet engine. In addition to the throttle, there are valves which control bleed air at different stages of the engine, stator vanes can be rotated to compensate for airflow rotation speeds between stages, and different parts of the engine are actively cooled by air jets to minimize the gap between the end of the turbine blades and the casing of the engine (the engine will expand under heat and let more air pass around the blades if not actively managed).
All of these factors affect fuel efficiency under different conditions, and it is virtually impossible to build an algorithm by hand which will produce the optimal values under all conditions. Usually, a software model will be built, optimized and validated for the most common regions of the input parameter space, and tested to ensure that performance remains reasonable in the more extreme portions. But this often leaves many conditions in which the algorithm is known not to offer optimal control. One of the reasons machine learning is becoming so popular is that it can automatically optimize these high-dimensional problems (look at all the sensor inputs and think about how to control each valve and actuator). Even then, a solution discovered by ML is not guaranteed to be optimal either, leaving room for future improvement.
Rather than trying to craft the perfect algorithm in one go, all complex software starts at a simpler stage and evolves over time. One of the hardest constraints is testing. While there are theoretical models of how an engine behaves under a variety of conditions (ambient pressure, temperature, humidity, etc.), a real-world engine will deviate from this model due to manufacturing variance up to model inadequacy. So if you produce a new control model and claim that it improves engine efficiency by 3% under long-range cruise conditions, then at some point, you need to actually fly a route and gather some data. Such tests could have been done at any time, including before the FADEC was originally released to production. But waiting until you have optimized every scenario as much as you can is a significant opportunity cost that most corporations cannot afford. Much better to release a product that is at least as good as the current market (or some defined improvement level), and then iterate the design after you are already rolling engines off the assembly line.
This is why software updates are constantly being released, in pretty much every area of software production. Imagine if Tesla refused to sell any cars until Full Self-Driving was totally finished. In general, you should assume that any control system which has more than a dozen parameters also has a complex optimization space that is non-trivial to characterize completely. The FADEC illustrated in the link above has half a dozen actuators and 10 input parameters. That means the optimal control program is at least a 6-dimensional surface within a 16-dimensional parameter space. It is not hard to imagine that the first approximation of this program leaves a lot of room for improvement, even if the performance is better than all previous designs.
It means that software revisions to the FADEC code have improved the precision of the FADEC and its ability to manage temperatures when regulating fuel flow.
This means they are able to shave off more of the tolerance margins, fudge factors you could say, built into the code and can run the engine ever closer to its actual thermodynamic limits without risk of exceedances.