Functioned as designed
Your larger point is well taken, and I agree. But in the specific case of the 737 Max software, we will find that it is a "garbage-in-garbage-out" problem, the roots of which go way, way back, before "software updates" were even a thing. In this case, the algorithm is flawed.
In every motion control system, there are actuators and sensors. For example, "move the control surface" and then "what is my new angle of attack?" In the 737 Max software, you have an inverse (divergent, open-loop) problem, that is a single-sensor reading causing an unrelated actuator to engage. This problem will be fixed by using a redundant sensor, that is, either a second angle-of-attack sensor, or an accelerometer / gyro / wind speed / air flow sensor to confirm the initial sensor. AND THEN make the decision to change a control surface. Normally this "redundant sensor" would be the pilot, but this video game programmer who wrote the 737 Max software has optimized this critical step out of his algorithm. In other words, an actuator has been commanded based on a single sensor reading, and faulty logic of the software designer. If this sensor is defective, the logic fails.
The software probably functioned as designed. (It always does.)