Здравствуйте, Masterspline, Вы писали:
BFE>>>Например, в авионике это 100% покрытие кода тестами.
L>>А вне авионики давно поняли, что 100% покрытие сценариев исполнения != 100% покрытия кода. См. 737 MAX.
M>Хотелось бы разъяснения столь глубокой мысли про 100% != 100%.
Глупый пример:
int calculateDistance(int a, int b) {
return a - b;
}
Тупой единственный тест обеспечит 100% покрытие кода... но все ли сценарии покрыты?
M>Насколько я знаю, в случае 737 MAX код отработал как ему полагается.
Как там говорилось.. "Компьютер сделает в точности то, что вы ему задали, но это будет отличаться от того, что вы имели в виду".
M>Там изначально было рассчитано, что код полагается на показания одного датчика из двух и код делал именно то, что и нужно, если бы датчик давал такие показания, какие получал код.
M>Неприятность только была в том, что данные были неверными.
Неприятность была в том, что с точки зрения анализа отказов, вероятность отказа этого датчика, как бы помягче сказать, стремится к 100%. Соответственно, сценарий, когда датчик изначально дохлый или внезапно начинает дурить — совершенно ожидаемый.
Но этот сценарий не был протестирован.
Покрытие кода могло было 100%, но это не имеет абсолютно никакого значения.
Каким бы черезжопным не было сама идея MCAS, ее можно и нужно было реализовывать так, чтобы отказ был безопасным. Даже с одним датчиком.
M>Причем в одном случае датчик совсем отвалился и на вход шел мусор (который можно было распознать программно), а в другом случае датчик заклинило и программно никак нельзя было распознать, что данные не верные (потому что датчик заклинило в вертикальном положении и он выдавал это положение).
А это уже детали.
Кстати, использование двух датчиков в лучшем случае позволяет лишь реализовать режим отказа: если датчики не могут договориться, MCAS обязан деактивироваться. Только это не панацея, вероятность одновременного похожего отказа двух датчиков вовсе не такая маленькая, поэтому реализация MCAS обязана была учитывать и такой сценарий.