Honestly I don't think the 737 MAX was a software failure so much as a weird intersection of failures in:
- regulation (FAA incentivized not modifying the primary frame/wings),
- aerospace engineering (weight too high for existing control surfaces, necessitating a weird control surface on the tail),
- systems engineering (specifying activating MCAS during a 1-out-of-2 sensor failure instead of 2-out-of-3/etc),
- and training. The procedures for new MCAS system changes weren't drilled into pilots to perpetuate the perception that this was still the same 737 and didn't need in-depth FAA review. In fact, Boeing managers and the FAA removed references to MCAS from Boeing's flight crew operations manual (FCOM).
The software didn't seem like it had a bug or even particularly poorly designed for the intended system. I'm not sure I'd find the software engineers at fault...they followed the specification given by the systems engineers, and it would have looked reasonable to a software engineer. The intended overall system was fucking atrocious, however. I'd absolutely lay the blame for the 737 MAX incidents on the business managers, aerospace engineers, and especially the systems engineers.
MCAS involved a good amount of software, but it wasn't the software which caused the failure.